0

メソッドに渡されたリストに基づいて、必要なすべての文字列を取得するはずの次の非同期メソッドがあります。

public async Task<List<string>> GetStrings(List selections)
{
    List<string> myList = new List<string>();
    TaskCompletionSource<List<string>> someStrings = new TaskCompletionSource<List<string>>();

    // Register/deregister event that is fired on each selection.
    // Once this event is received, I get its arguments from which I 
    // get string and add it to my list of strings.
    // Once the list count matches number of selections passed into the method,
    // TaskCompletionSource result is set.
    EventHandler<IDataNotification> onCallThatFiresCompleted = null;
    onCallThatFiresCompleted = (sender, e) =>
    {
        var myString = e.getString();
        myList.Add(myString);
        if (myList.Count == selections.Count)
        {
            MyObserver.DataNotification -= onCallThatFiresCompleted;
            someStrings.TrySetResult(myList);
        }
    };
    MyObserver.DataNotification += onCallThatFiresCompleted; 


    foreach (var sel in selections)
    {
        // This call fires onCallThatFiresCompleted event that when received 
        // will conteain string I need in its arguments.
        CallThatFires_MyEvent();
    }

    return await someStrings.Task; //await for the task
}

タスクが完了したら、このメソッドの呼び出し元はどのように Task.ContinueWith() を使用して、返されたリストを処理しますか? 私はこのようなことをしたい:

foreach(var s in returnedStringList)
{
  // do something with the string s
}
4

1 に答える 1

3

この例での ContinueWith の使用方法

あなたはそうしない。あなたが使用するawait

var returnedStringList = await GetStrings(..);
foreach(var s in returnedStringList)
{
  // do something with the string s
}

私のブログで説明しているように、はあらゆる点で非同期コードawaitよりも優れています。ContinueWith

于 2016-06-28T23:54:22.203 に答える