下面提到的UpdateMethod可以从各种用户操作(如按钮UpdateSW1,UpdateSW2,UpdateSW3)中调用。
如果用户单击UpdateSW1按钮,它将暂停任务10秒钟,此处的waitTime为2。现在,单击完成后,用户也可以单击UpdateSW2,这时,由于第一次单击(UpdateSW1),我想取消正在进行的任务延迟或其他操作,然后启动UpdateSW2的操作。
private void UpdateMethod(int waitTime, int actionNo)
{
Task.Run(async () =>
{
while (waitTime != 0)
{
waitTime--;
await Task.Delay(5000);
}
// DO other stuff ...
if (actionNO == 1)
{
//ops for UpdateSW1
}
else
{
//ops for UpdateSW2.
}
});
}
Update1:
经过一番尝试,我想出了以下代码,现在在某种程度上可以正常工作,但仍需要改进。如果用户依次单击按钮UpdateSW1和UpdateSW2,然后我单击“取消”按钮,它将取消其中一个任务(由于UpdateSW1 click的结果而正在运行),但不取消另一个任务(由于单击updteSW2而正在运行)我希望取消这两个任务。如何实现这一目标。
修改后的方法:
private CancellationTokenSource cts; // declared as class variable.
private void UpdateMethod(int waitTime, int actionNo)
{
cts = new CancellationTokenSource();
CancellationToken token1 = cts.Token;
try
{
Task.Run(async () =>
{
while (waitTime != 0)
{
waitTime--;
await Task.Run(() => Task.Delay(5000, token1), token1);
token1.ThrowIfCancellationRequested();
}
// DO other stuff ...
if (actionNO == 1)
{
//ops for UpdateSW1
}
else
{
//ops for UpdateSW2.
}
}, token1);
}
catch (OperationCanceledException e)
{
// update DB log
}
}
答案 0 :(得分:0)
整个等待循环
import json
with open(filename) as json_file:
all_data = json.load(json_file)
for entry in all_data:
year = entry["Year"]
# Do something with year
可以简化为
while (waitTime != 0)
{
waitTime--;
await Task.Run(() => Task.Delay(5000, token1), token1);
token1.ThrowIfCancellationRequested();
}
当令牌发出信号时,延迟将结束。无需绕行。