使用 .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
}