我正在尝试应用 EAP 模式来调用 WCF 服务。相同的代码在 Windows 控制台应用程序上运行顺利,但在 Windows Phone 应用程序上的 Task.Wait 上无限期挂起。
任何关于这个问题的想法都将受到高度赞赏。
提前致谢
这是扩展方法和辅助函数:
public static class ServiceExtensions
{
public static Task<string> DoGlobalizationResourcesInquiryAsyncTask(
this Service1Client serviceClient,
int request)
{
var tcs = new TaskCompletionSource<string>();
EventHandler<GetDataCompletedEventArgs> handler = null;
handler = (sender, e) => EAPHelpers.TransferCompletion(
tcs,
e,
() => e.Result,
() => serviceClient.GetDataCompleted -= handler);
serviceClient.GetDataCompleted += handler;
try
{
serviceClient.GetDataAsync(request, tcs);
}
catch
{
serviceClient.GetDataCompleted -= handler;
tcs.TrySetCanceled();
throw;
}
return tcs.Task;
}
}
public static class EAPHelpers
{
public static void TransferCompletion<T>(
TaskCompletionSource<T> tcs,
AsyncCompletedEventArgs e,
Func<T> getResult,
Action unregisterHandler)
{
if (e.UserState == tcs)
{
if (e.Cancelled) tcs.TrySetCanceled();
else if (e.Error != null) tcs.TrySetException(e.Error);
else tcs.TrySetResult(getResult());
if (unregisterHandler != null) unregisterHandler();
}
}
}
我调用扩展方法如下:
Service1Client client = new Service1Client();
var task = client.DoGlobalizationResourcesInquiryAsyncTask(3);
task.Wait();
var response = task.Result;