изолированность сервисов .net асинхронность работы
От: Аноним  
Дата: 09.01.11 14:45
Оценка:
Допустим есть модули которые взаимодействуют асинхронно , например модуль создания данных и модуль осуществляющий запись в файл.
Асинхронность реализуется посредством вызова делегата который модуль создания данных передает в модуль записи.
Т.е. примерно как показано ниже.
Все хорошо пока это все живет на одном компьютере. Теперь представим что в целях масштабируемости необходимо разнести эти 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();
    }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.