我有一个启动两个线程的按钮
private void CrawdBtn_Click(object sender, EventArgs e)
{
CrawdBtn.Enabled = false;
t = new Thread(AddLinksToList);
b = new Thread(EnqueueFromList);
t.Start();
b.Start();
}
还有另一个按钮可以暂停、恢复、停止这些线程 我的问题是如何在线程工作时禁用(暂停、恢复、停止)按钮并在线程完成后重新启用爬网
最佳答案
以下是启动线程
并等待其完成的方法:
public static Thread CreateAwaitableThread(Action action, out Task threadCompletion)
{
var tcs = new TaskCompletionSource<bool>();
threadCompletion = tcs.Task;
return new Thread(() =>
{
try
{
action();
}
finally
{
tcs.SetResult(true);
}
});
}
此方法返回新创建的Thread
,以及当Thread
完成时将完成的Task
。你可以这样使用它:
private async void CrawdBtn_Click(object sender, EventArgs e)
{
CrawdBtn.Enabled = false;
Thread t1 = CreateAwaitableThread(AddLinksToList, out var t1c);
Thread t2 = CreateAwaitableThread(EnqueueFromList, out var t2c);
t1.Start();
t2.Start();
await Task.WhenAll(t1c, t2c);
CrawdBtn.Enabled = true;
}
如果出现异常,错误将不会通过任务
传播。假设委托(delegate)已经包含错误处理逻辑。如果没有,将照常发生未处理的异常。
关于c# - 线程工作时启用/禁用按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59546633/