我需要在按钮事件上同时调用两次相同的任务。当用户按下按钮时,任务被调用,因此如果他们多次按下它,则需要多次调用它。用户选择一个单选按钮然后单击按钮来执行某些操作,因此我需要更改与单选按钮相关的特定对象。 (UI锁定直到任务完成或选择了不同的单选按钮)如果选择了另一个单选按钮,则允许我的用户再次按下该按钮是至关重要的。
目前我的代码是:
private void Btn_VolumeInject_Click(object sender, EventArgs e) => ButtonHandler("sampleCase");
private async void ButtonHandler(string action, string type = "") {
switch (action) {
case "sampleCase":
foreach (Object o in ObjectList) {
if(o.Name == currentObject.Name){ //currentObject is a global that changes depending on what radio button is selected in the winform
Debug.WriteLine("start " + o.Name + " " + o.IsRunning);
o.IsRunning = true;
await Task.Run(() => SampleTask());
o.IsRunning = false;
Debug.WriteLine("end" + o.Name + " " + o.IsRunning);
}
}
break;
//more cases for different buttons....
}
}
所以在这段代码中,首次点击时第一个任务开始,第二个点击第二个任务开始。当第一个任务完成时,第一个对象IsRunning
变为false,但第二个对象IsRunning
保持为真并再次开始。是因为它不是线程安全的吗?
第一个对象名称为old
,第二个对象名称为new
。
SampleTask()
被改变为只是延迟时间来看看会发生什么。
输出结果为:
start old False
start new False
end old False
start new True
end new False
end new False
添加
if(o.IsRunning){ //prior to the first Debug.WriteLine
break;
}
解决了我的问题,但我想知道为什么当我只按下按钮2次时任务会运行3次。