如何同时调用两次相同的任务

时间:2018-03-29 13:15:15

标签: c# winforms asynchronous task

我需要在按钮事件上同时调用两次相同的任务。当用户按下按钮时,任务被调用,因此如果他们多次按下它,则需要多次调用它。用户选择一个单选按钮然后单击按钮来执行某些操作,因此我需要更改与单选按钮相关的特定对象。 (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,第二个对象名称为newSampleTask()被改变为只是延迟时间来看看会发生什么。

输出结果为:

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次。

0 个答案:

没有答案