c# - 线程工作时启用/禁用按钮

标签 c# multithreading winforms button

我有一个启动两个线程的按钮

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/

相关文章:

c# - 如何模拟没有接口(interface)的方法?

c# - 使用 Microsoft.Build.Evaluation 发布数据库项目 (.sqlproj)

c# - 如何在自定义 WPF 控件中初始化集合属性

c# - 连接没有像它应该的那样关闭

winforms - 工具提示上的 AccessViolationException 导致 COMCTL32.dll - .NET 4.0

python - 线程模块的引用未被 gc 删除

java - 是否可以通过使用单个 volatile 来防止乱序执行

c# - 如何在用 C# 编写的控制台应用程序中捕获来自工作线程的错误

c# - 在 C# Windows 应用程序中将色板保存在 ColorDialog 上

c# - 如何在行选择中保留带有 "Checking"复选框的 C# Listview 控件?