1

WCF サービスを呼び出すために EAP パターンを適用しようとしています。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;
4

0 に答える 0