1

Let's assume I have an async method, which notifies me via an event when a certain change happens. Currently I'm able to assign the event's information to a static variable like this:

    static EventInfo result = null;



    // eventHandler, which assigns the event's result to a locale variable
    void OnEventInfoHandler(object sender, EventInfoArgs args)
    {
       result = args.Info;
    }



    resultReceived += OnEventInfoHandler;        

    // async method call, which fires the event on occuring changes. the parameter defines on what kind of change the event has to be fired
    ReturnOnChange("change");

But I would like to assign the callback value to a locale variable like this:

var result_1 = ReturnOnChange("change1");
var result_2 = ReturnOnChange("change2");

So I could distinguish between different method calls and their corresponding events, without using any static fields.

4

2 に答える 2

3

TaskCompletionSource を使用できます。

public Task<YourResultType> GetResultAsync(string change)
{
    var tcs = new TaskCompletionSource<YourResultType>();

    // resultReceived object must be differnt instance for each ReturnOnChange call
    resultReceived += (o, ea) => {
           // check error

           tcs.SetResult(ea.Info);
         };

    ReturnOnChange(change); // as you mention this is async

    return tcs.Task;

}

その後、次のように使用できます。

var result_1 = await GetResultAsync("change1");
var result_2 = await GetResultAsync("change2");

async/await メカニズムを使用せず、結果のためにスレッドをブロックしたい場合は、次のようにします。

var result_1 = GetResultAsync("change1").Result; //this will block thread.
var result_2 = GetResultAsync("change2").Result;
于 2013-06-26T09:43:26.037 に答える
1

必要なデータを含むように拡張され、非同期アクティビティから渡された場合EventInfoArgs、区別する必要はありません。ハンドラーの実装は、必要なすべてを認識します。

それをしたくない場合は、何objectを として返しますsenderか?

于 2013-06-26T09:28:01.730 に答える