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 を無効にする必要があります。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 ブール値が true かどうかを確認する必要があります。true の場合は、次のような 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 に答える