线程/任务等待按钮单击

时间:2018-04-16 05:06:06

标签: c# multithreading

好吧,我有这个Windows窗体应用程序,其中包含与我的应用程序并行运行的任务( System.Thread.Tasks )。在某种程度上,此任务必须等待按钮单击(位于主线程中)并从此按钮捕获数据。 我有一个代码,这是惊人的工作正常。但我相信这不是最好的方法,我认为我应该使用事件,但完全诚实,我刚开始学习事件,所以我仍然有点困惑。如果我是对的,请告诉我如何才能让它变得更好。

这是我的代码示例:

bool BooleanHelper = false;
int ButtonData;

private void MyButton_Click(object sender, EventArgs e) {
   BooleanHelper = true;
   ButtonData = 5; //example      
}

private void MyForm_Shown(object sender, EventArgs e) {
   Task t = Task.Run(()=>{
      while(!BooleanHelper){} //this can't be a good pratice .__.

      // now if the program reaches this line, it means that we can use the ButtonData.
   });
}

2 个答案:

答案 0 :(得分:3)

使用TaskCompletionSource创建一个任务,您可以在其中控制完成时间:

TaskCompletionSource<int> buttonTcs = new TaskCompletionSource<int>();

private void MyButton_Click(object sender, EventArgs e)
{
  buttonTcs.SetResult(5);
}

private async void MyForm_Shown(object sender, EventArgs e)
{
  var buttonData = await buttonTcs.Task;

  // now if the program reaches this line, it means that we can use the ButtonData.
}

我不知道你的MyForm_Shown中的任务是否只是因为你使用过的繁忙等待。如果它实际上需要包装在Task.Run中的长期运行的东西,而不仅仅是在你的任务中移动await。

答案 1 :(得分:1)

有很多线程原语,事件对此很有用......

resolve

但我还有其他方法,比如基于Actor的派遣。