区分C#中的异步方法回调

本文关键字:异步方法 回调 区分 | 更新日期: 2023-09-27 18:20:01

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

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

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

区分C#中的异步方法回调

您可以使用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;

如果EventInfoArgs被扩展为包括您所需的数据,则无需区分。处理程序实现将知道它所需要的一切。

如果您不想这样做,您将返回什么object作为sender