C# 异步事件订阅
我使用的是第三方API,它看起来像是使用事件驱动架构编写的。我正在对API上的一个方法进行异步调用,但该方法的响应仅在事件处理程序中返回。因此,我必须订阅事件,然后调用API的方法调用 伪代码示例: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;
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.5async
和wait
中的新关键字。它产生了更简单的代码。您可以从Parallel.NET团队的Stephen Toub那里阅读更多关于TaskCompletionSource
的信息,谢谢,但请阅读我所说的帖子,我订阅的事件返回的是结果,而不是等待它的实际函数。我想同时运行事件和事件处理程序,这样当TestPost函数返回时,它就有一个来自事件处理程序参数的值。谢谢:)
var myVar = await TestPost();