1

假设我有一个异步方法,当发生某种变化时,它会通过一个事件通知我。目前我可以将事件的信息分配给一个静态变量,如下所示:

    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");

但我想将回调值分配给这样的语言环境变量:

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

所以我可以在不使用任何静态字段的情况下区分不同的方法调用及其相应的事件。

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 回答