0

サービス クライアントによって呼び出される WCF サービスがあります。async / await コンストラクトを使用して、これへの呼び出しをラップしたいと思います。ただし、サービスとサービス クライアントは .NET3.5 です。これに対する私の解決策は次のとおりです。

private async Task<ObservableCollection<MyEntity>> LoadData(ParamData param)
{
        ServiceClient svc = new ServiceClient();
        int results = 0;

        // Set-up parameters
        myParams = BuildParams(param);

        // Call a count function to see how much data we're talking about
        // This call should be relatively quick
        var counter = Task.Factory.StartNew(() =>
        {
            results = svc.GetResultCount(myParams);
        }).ContinueWith((task) =>
        {
            if (results <= 10000 ||
                (MessageBox.Show("More than 10000 results, still retrieve data?"), MessageBoxButton.YesNo) == MessageBoxResult .Yes))
            {
                return svc.Search(myParams);
            }
        });
}

コンパイルエラーが発生します:

Since 'System.Action<System.Threading.Tasks.Task>' returns void, a return keyword must not be followed by an object expression

それで、私の質問は、この方法で同期メソッドを実行することは可能ですか?もしそうなら、私は何を間違っていますか? 私の目的は、メソッドを次のように呼び出すことができることです。

var data = await LoadData(params);
4

3 に答える 3

0

わかりました - 私はこれを解決しました。return ステートメントは、関数ではなくタスクから戻ります。それが不平を言った理由です。

正しいコードは次のようになります。

private async Task<ObservableCollection<MyEntity>> LoadData(ParamData param)
{
    ServiceClient svc = new ServiceClient();
    int results = 0;

    // Set-up parameters
    myParams = BuildParams(param);

    // Call a count function to see how much data we're talking about
    // This call should be relatively quick
    var counter = Task.Factory.StartNew(() =>
    {
        results = svc.GetResultCount(myParams);
    });

    var returnTask = counter.ContinueWith((task) =>
    {
        if (results <= 10000 ||
            (MessageBox.Show("More than 10000 results, still retrieve data?"), MessageBoxButton.YesNo) == MessageBoxResult .Yes))
        {
            return svc.Search(myParams);
        }
    });

    return returnTask.Result;
}
于 2013-09-19T08:47:01.657 に答える