Аппаратные средства.
Партии и много аппаратных средств. Они используют значительные кластеры товарных ПК как их ферма сервера.
Реализовать асинхронные операции на стороне сервера довольно просто. Убедитесь, что имена ваших методов совпадают и имеют префиксы 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();
}
}
}
}
Когда вы выбираете «Создать асинхронные операции», как вы заметили, никакой магии не требуется: Начать ...
начнет ваше общение, сервер начнет обрабатывать данные, но вы не сможете ничего использовать, пока не вызовете 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)]