在.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函数结束,但它似乎不做任何事情…?

在.net 4中使用任务等待事件触发

可以用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
}