在.net 4中使用任务等待事件触发
本文关键字:等待 事件 任务 net | 更新日期: 2023-09-27 17:50:41
我有一个函数A,它从一个我无法修改的外部类调用函数B。函数B在完成时触发一个事件,我订阅了doSomeStuff函数。我只想在doSomeStuff完成时完成函数A。我只能使用。net 4,所以不使用async等。我现在的设置是冻结我的程序;
static EventWaitHandle _WaitHandle = new AutoResetEvent(false);
public void functionA()
{
functionB.completed += doSomeStuff;
Task runFunctionB = Task.Factory.StartNew(() => { functionB(); });
_WaitHandle.WaitOne();
}
public void doSomeStuff(object sender, EventArgs e)
{
// do stuff
WaitHandle.Set();
}
我希望任务runFunctionB作为一个单独的线程执行,因此在我的doSomeStuff函数结束,但它似乎不做任何事情…?
可以用TaskCompletionSource<T>
代替WaitHandle
,等待TaskCompletionSource<T>.Task
。
TaskCompletionSource<object> completionSource = new TaskCompletionSource<object>();
public void functionA()
{
functionB.completed += doSomeStuff;
Task runFunctionB = Task.Factory.StartNew(() => { functionB(); });
completionSource.Task.ContinueWith((result)=>
{
//Do whatever
});
}
public void doSomeStuff(object sender, EventArgs e)
{
// do stuff
completionSource.SetResult(null);
}
我只能使用。net 4,所以不使用async等。
那是一种误解。你可以在。net 4.0中使用BCL使用async-await。如果你的Visual studio 2012或更高版本仍然瞄准。net 4.0,则可以使用异步内核包。
在这种情况下,你可以等待任务。
public async Task functionA()
{
functionB.completed += doSomeStuff;
Task runFunctionB = Task.Factory.StartNew(() => { functionB(); });
await completionSource.Task;
//Do whatever; event is raised
}