0

我想在线程运行时禁用文本框。线程执行完成后,表单上的文本框应该被启用。

代码

Thread thread = new Thread(new ThreadStart(ScannerThreadFunction));
thread.Start();

    public void ScannerThreadFunction()
    {            
        try
        {
            Scan();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        finally
        {
        }
    }

在 Scan() 运行之前,应该禁用 TextBox。扫描()完成后,我想启用文本框。

4

2 回答 2

2

在 WPF 中,您可以在扫描方法期间执行此操作。您只需要将 TextBox 的启用和禁用推送到 UI 线程,然后使用调度程序执行此操作,如下所示:

private void button1_Click(object sender, RoutedEventArgs e)
{
    var thread = new Thread(new ThreadStart(ScannerThreadFunction));
    thread.Start();
}

public void ScannerThreadFunction()
{
    try
    {
        Scan();
    }
    catch (Exception ex)
    {
        //Writing to the console won't be so useful on a desktop app
        //Console.WriteLine(ex.Message);
    }
    finally
    {
    }
}

private void Scan()
{
    Application.Current.Dispatcher.Invoke(DispatcherPriority.Normal,
                                          new Action(() => MyTextbox.IsEnabled = false));

    //do the scan

    Application.Current.Dispatcher.Invoke(DispatcherPriority.Normal,
                              new Action(() => MyTextbox.IsEnabled = true));
}

在 WinForms 中,您也可以在扫描方法期间执行此操作,但执行方式略有不同。您需要检查表单本身的 InvokeRequired 布尔值是否为真,如果是,请使用 MethodInvoker,如下所示:

private void button1_Click(object sender, EventArgs e)
{
    var thread = new Thread(new ThreadStart(ScannerThreadFunction));
    thread.Start();
}

public void ScannerThreadFunction()
{
    try
    {
        Scan();
    }
    catch (Exception ex)
    {
        //Writing to the console won't be so useful on a desktop app
        //Console.WriteLine(ex.Message);
    }
    finally
    {
    }
}

private void Scan()
{
    ChangeTextBoxIsEnabled(false);

    //do scan

    ChangeTextBoxIsEnabled(true);
}

private void ChangeTextBoxIsEnabled(bool isEnabled)
{
    if (InvokeRequired)
    {
        Invoke((MethodInvoker)(() => MyTextbox.Enabled = isEnabled));
    }
    else
    {
        MyTextbox.Enabled = isEnabled;
    }
}
于 2013-06-16T11:52:06.953 回答
0

在您启动后台线程之前 - 禁用您的文本框。在后台线程中,在处理完成时通知主线程(如果您使用的是 WPF,请使用主线程的Dispatcher),然后在主线程中再次启用文本框。

于 2013-06-16T11:34:14.050 回答