在服務器端實現異步操作非常簡單。確保您的方法名稱匹配並以開始和結束爲前綴。 GetImageAsyncResult是一個自定義的IAsyncResult實現(大量Web上的例子)。
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();
}
}
}
}
謝謝! IMapProvider將定義BeginGetImage和EndGetImage函數 - 標記爲「[OperationContract(AsyncPattern = true)]」?我需要從中定義具體的結果,GetImageAsyncResult? – stiank81
正確 - 我在網上找到了一個基地AsyncResult類。 GetImageAsyncResult從中派生。 – Goran
好的 - 這回答我的問題。但是,我意識到我不想使服務異步,但我想異步調用同步服務。即我會在客戶端處理它。我使用AsyncMethodCaller輕鬆解決這個問題。不管怎麼說,還是要謝謝你! – stiank81