使用 .net 4 中的任务等待事件触发
Wait for an event to fire using tasks in .net 4
我有一个函数 A,它从我无法修改的外部 class 调用函数 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);
}
I can only use .Net 4, so no use of async etc..
这是一种误解。您可以使用 BCL.Async nuget 包在 .Net 4.0 中使用 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
}
我有一个函数 A,它从我无法修改的外部 class 调用函数 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);
}
I can only use .Net 4, so no use of async etc..
这是一种误解。您可以使用 BCL.Async nuget 包在 .Net 4.0 中使用 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
}