Допустим есть модули которые взаимодействуют асинхронно , например модуль создания данных и модуль осуществляющий запись в файл.
Асинхронность реализуется посредством вызова делегата который модуль создания данных передает в модуль записи.
Т.е. примерно как показано ниже.
Все хорошо пока это все живет на одном компьютере. Теперь представим что в целях масштабируемости необходимо разнести эти 2 модуля по разным компьютерам. Вариант WCF с дуплексной связью не подходит, т.к. по требованиям нельзя иметь на компьютере у DataCreator входящий открытый сокет постоянно.
Что сделать ? Можно конечно передавать данные через базу данных — один пишет, другой читает , но тогда нужно чтобы тот же DataCreator постоянно крутил запрос select чтобы узнать не появилась ли новая запись по результатам FileWriter — не эффективно. Какие есть оптимальные решения для этого ?
public class DataCreator
{
public static FileWriter fw = new FileWriter();
public void SaveData( byte[] data )
{
fw.Save( data, new Action( OnDataSaved ));
}
public void OnDataSaved()
{
/// Тут получаем как бы асинхронно ответ о том что операция сохранения завершена
}
}
public class FileWriterJob
{
private byte[] data;
private Action oncompleted;
public FileWriterJob( byte[] data, Action oncomplete )
{
this.data = data;
this.oncompleted = oncomplete;
}
public void Complete()
{
if ( oncompleted != null )
oncompleted();
}
}
public class FileWriter
{
public void Write( FileWriterJob job )
{
/// Вызываем асинхронную запись, по завершению вызовется OnWriteCompleted
}
public void OnWriteCompleted( IAsyncResult res )
{
/// Достаем FileWriterJob из IAsyncResult и вызываем Complete
job.Complete();
}
}