C# 异步事件订阅

C# 异步事件订阅,c#,asp.net-mvc,async-await,event-driven,C#,Asp.net Mvc,Async Await,Event Driven,我使用的是第三方API,它看起来像是使用事件驱动架构编写的。我正在对API上的一个方法进行异步调用,但该方法的响应仅在事件处理程序中返回。因此,我必须订阅事件,然后调用API的方法调用 伪代码示例: private string myValue; public async Task<string> TestPost() { // Subscribe to event api.OnSomeAPIFunctionResponse += EventHandler1;

我使用的是第三方API,它看起来像是使用事件驱动架构编写的。我正在对API上的一个方法进行异步调用,但该方法的响应仅在事件处理程序中返回。因此,我必须订阅事件,然后调用API的方法调用

伪代码示例:

private string myValue;

public async Task<string> TestPost()
{
    // Subscribe to event
    api.OnSomeAPIFunctionResponse += EventHandler1;

    await CallAPIFunction(...with some parameters...);

    return myValue;
}

private void EventHandler1(sender, args)
{
    // This is the value I want to return in the previous function
    myValue = args.value;
}
私有字符串myValue;
公共异步任务TestPost()
{
//订阅活动
api.OnSomeAPIFunctionResponse+=EventHandler1;
等待调用函数(…带有一些参数…);
返回myValue;
}
私有void EventHandler1(发送方,参数)
{
//这是我想在上一个函数中返回的值
myValue=args.value;
}
在上面的代码示例中,当我运行应用程序时,myValue为null,因为事件处理程序代码在函数返回执行后生效

如何使事件处理程序在TestPost函数返回之前异步执行


请告诉我这里可以做什么。

你到底想做什么?通过调用
TestPost.Wait()
可以获得正确的
MYVALUE
值,但这是一个阻塞操作,从UI线程调用它可能会导致死锁

如果您试图为函数的结果设置一个值,最好等待它的结果

var myVar = await TestPost();
这对
async/await

编辑:

作为对您的评论的回应,您可以使用
TaskCompletionSource
实现您想要的功能。这是未经测试的代码,但可能是这样的:

    public Task<string> TestPost()
    {
        var tcs = new TaskCompletionSource<string>();
      // Subscribe to event
      api.OnSomeAPIFunctionResponse += ( (s, e) => tcs.SetResult(args.value));

      CallAPIFunction(...with some parameters....);
      return tcs.Task;
    }

TaskCompletionSource
允许您将较旧的异步API转换为使用基于任务的异步模式。这反过来允许您使用任务并行库提供的功能,并使用.NET 4.5
async
wait
中的新关键字。它产生了更简单的代码。您可以从Parallel.NET团队的Stephen Toub那里阅读更多关于
TaskCompletionSource
的信息,谢谢,但请阅读我所说的帖子,我订阅的事件返回的是结果,而不是等待它的实际函数。我想同时运行事件和事件处理程序,这样当TestPost函数返回时,它就有一个来自事件处理程序参数的值。谢谢:)
var myVar = await TestPost();