Реализация асинхронного сервиса WCF

Аппаратные средства.

Партии и много аппаратных средств. Они используют значительные кластеры товарных ПК как их ферма сервера.

6
задан stiank81 11 December 2009 в 20:28
поделиться

2 ответа

Реализовать асинхронные операции на стороне сервера довольно просто. Убедитесь, что имена ваших методов совпадают и имеют префиксы Begin и End. GetImageAsyncResult - это настраиваемая реализация IAsyncResult (множество примеров в сети).

    public class MapProvider : IMapProvider //implementation - belongs to server
    {
         public IAsyncResult BeginGetImage(int level, int x, int y, string[] layers, AsyncCallback callback, object state)
         {
              GetImageAsyncResult asyncResult = new GetImageAsyncResult(level, x, y, layers, callback, state);
              ThreadPool.QueueUserWorkItem(Callback, asyncResult);
              return asyncResult;
         }

         private void Callback(object state)
         {

              GetImageAsyncResult asyncResult = state as GetImageAsyncResult;
              asyncResult.Image = TileProvider.GetImage(asyncResult.Level, asyncResult.X, asyncResult.Y, asyncResult.Layers);
              asyncResult.Complete();
         }

         public System.Drawing.Bitmap EndGetImage(IAsyncResult result)
         {
              using (GetImageAsyncResult asyncResult = result as GetImageAsyncResult)
              {
                   asyncResult.AsyncWait.WaitOne();
                   return asyncResult.Image;
              }
         }
    }

    public class MapProviderProxy : ClientBase<IMapProvider>, IMapProvider, IDisposable
    {
         public IAsyncResult BeginGetImage(int level, int x, int y, string[] layers, AsyncCallback callback, object state)
         {
              return Channel.BeginGetImage(level, x, y, layers, callback, state);
         }

         public System.Drawing.Bitmap EndGetImage(IAsyncResult result)
         {
              return Channel.EndGetImage(result);
         }

         public void Dispose()
         {
              if (State == CommunicationState.Faulted)
              {
                   Abort();
              }
              else
              {
                   try
                   {
                        Close();
                   }
                   catch
                   {
                        Abort();
                   }
              }
         }
    }
5
ответ дан 9 December 2019 в 22:35
поделиться

Когда вы выбираете «Создать асинхронные операции», как вы заметили, никакой магии не требуется: Начать ... начнет ваше общение, сервер начнет обрабатывать данные, но вы не сможете ничего использовать, пока не вызовете End ... .

Все это поведение происходит на стороне клиента, поэтому вам не нужно изменить что-либо в реализации службы.

Вы, вероятно, думаете, что это должно быть сложно, но это не так;)

EDIT: Вот пример:

using (Service.SampleClient client = new Service.SampleClient())
{
    client.AddCompleted += 
        (object sender, Service.AddCompletedEventArgs e)
            {
                Console.WriteLine(e.Result); // 2
            };
    client.AddAsync(1, 1);

    // wait for async callback
    Console.ReadLine();
}

[ServiceContract]
public interface ISample
{
    [OperationContract]
    int Add(int a, int b);
}

Вы также можете явно запрограммировать свою службу для работы async, как описано здесь: Синхронные и асинхронные операции , используя [OperationContract (AsyncPattern = true)]

3
ответ дан 9 December 2019 в 22:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: