C# 等待线程完成而不阻塞 UI

时间:2021-02-16 21:40:56

标签: c# windows vb.net visual-studio winforms

        checkerThread = new Thread(new ThreadStart(() => CheckTokens()));
        checkerThread.Start();

        // Re-enable controls when done
        stopCheckButton.Visible = false;
        stopCheckButton.Enabled = false;
        startCheckButton.Enabled = true;
        loadTokenListButton.Enabled = true;
        exportTokensButton.Enabled = true;
        clearCheckButton.Enabled = true;
        clearValidButton.Enabled = true;
        tokenInputBox.Enabled = true;

当线程运行时,我的表单中的控件被禁用。我想在线程完成后重新启用它们。如果不通过 thread.Join() 阻止 UI,我将如何做到这一点?

1 个答案:

答案 0 :(得分:0)

我建议考虑使用 BackgroundWorker

示例代码:

https://docs.microsoft.com/en-us/dotnet/desktop/winforms/controls/how-to-run-an-operation-in-the-background?view=netframeworkdesktop-4.8

这是另一个例子:

<块引用>

https://www.dotnetperls.com/backgroundworker-vbnet

public Class Form1

    Public Class ArgumentType
        Public _a As Int32
        Public _b As Int32
    End Class

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' Create the argument object.
        Dim args As ArgumentType = New ArgumentType()
        args._a = 5
        args._b = 6
        ' Start up the BackgroundWorker1.
        ' ... Pass argument object to it.
        BackgroundWorker1.RunWorkerAsync(args)
    End Sub

    Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, _
                                         ByVal e As System.ComponentModel.DoWorkEventArgs) _
                                         Handles BackgroundWorker1.DoWork
        ' Do some time-consuming work on this thread.
        System.Threading.Thread.Sleep(1000)
        ' Get argument.
        Dim args As ArgumentType = e.Argument
        ' Return value based on the argument.
        e.Result = args._a * args._b
    End Sub

    Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As System.Object, _
                                                     ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) _
                                                     Handles BackgroundWorker1.RunWorkerCompleted
        ' Called when the BackgroundWorker is completed.
        MessageBox.Show(e.Result.ToString())
    End Sub
End Class