1

Bing Api を呼び出すメソッドがあります。

IEnumerable<WebResult> Search(string query)

これを非同期にして、多くの呼び出しを行う場合、それらの呼び出しのそれぞれが独立しているようにします。したがって、ここのアドバイスに従って、署名を次のように変更しました

async Task<IEnumerable<WebResult>> SearchAsynch(string query)

しかし、私は警告を受け取ります

This async method lacks 'await' operators and will run synchronously...

メソッド全体を非同期にしたいです(少なくともそれが機能すると思います)。それ、どうやったら出来るの?これが私のコードです

public async Task<IEnumerable<WebResult>> SearchAsynch(string query)
        {
            if (query == null)
            {
                throw new ArgumentNullException("query cannot be null");
            }

            DataServiceQuery<WebResult> webQuery = _bingContainer.Web(query, null, null, null, null, null, null, null);
            IEnumerable<WebResult> webResults = webQuery.Execute();
            return webResults;
        }

問題は、このコードで何を待つべきかわからないことです。

4

5 に答える 5

4

私は Bing API にあまり詳しくありませんが、API に async メソッドが含まれていない場合は、呼び出しを started でラップすることで非同期を作成できますTaskasync修飾子は、メソッドを自動的に非同期にするわけではなく、await内部の他の非同期メソッドのみを許可します。

したがって、あなたの場合、おそらく最も簡単なのは次のとおりです。

public Task<IEnumerable<WebResult>> SearchAsync(string query)
    {
        if (query == null)
        {
            throw new ArgumentNullException("query cannot be null");
        }

        return Task.Run(() => 
            {
                DataServiceQuery<WebResult> webQuery = _bingContainer.Web(query, null, null, null, null, null, null, null);
                return webQuery.Execute();
            }
    }

await次に、次のようにマークされた他のメソッドでこのメソッドを実行できますasync

var result = await SearchAsync("yourQuery");

Bing API に非同期メソッド ペアがある場合は、非同期メソッド ペアからタスクを作成するためにBegin/End使用できます。Task.Factory.FromAsyncServy の回答は、そこで詳しく説明されています。

于 2013-04-08T20:53:26.417 に答える