在服务器端实现异步操作非常简单。确保您的方法名称匹配并以 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();
}
}
}
}