好吧,我有这个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.
});
}
答案 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的派遣。