0

longTask() スレッドを実行しているときに、次のコードを使用してフォーム コントロールを無効にしています。しかし、コントロールは無効になりません.. これが私のdisable()メソッドのコードです。

    public void disableFormControls()
    {
        if (InvokeRequired)
        {
            this.BeginInvoke(new Action(disableFormControls));
            return;
        }
        groupBoxInput.Enabled = false;
        groupBoxOutput.Enabled = false;
        btnGen.Enabled = false;
        btnReset.Enabled = false;
    }

これが私がそれを呼び出す方法です..注:LongTask()は別のスレッドで実行されます。

    private void LongTask()
    {
        disableFormControls();
        Console.WriteLine("Started Records::" + DateTime.Now);
        //Doing my long tasks here 
        enableFormControls();
    }

どこが間違っているのか教えてください..

4

3 に答える 3

4

これを試してください。 Invoke をenableFormcall の代わりに変更しましたdisableFormControls。また、これを非同期ではなく同期的に行ったので、UI が適切に更新されるまでバックグラウンド スレッドは何も実行しません。disableFormControlsまた、フォームのメソッドであると想定しています。

public void disableFormControls()
{
    if (InvokeRequired)
    {
        this.Invoke(new Action(disableFormControls));
        return;
    }
    groupBoxInput.Enabled = false;
    groupBoxOutput.Enabled = false;
    btnGen.Enabled = false;
    btnReset.Enabled = false;
}
于 2012-07-20T13:21:52.837 に答える
1

非UIスレッドからwinformUIコントロールを変更することはできないため、ここでは2つの選択肢があります。

  1. UIコードの有効化/無効化をUIスレッドに戻すことができます。タスクを開始する前に、UIスレッドのコントロールを無効にし、ディスパッチャーを使用して、タスクの完了時にUIスレッドでコントロールを有効に戻します。

  2. データバインディングを使用して、これらのコントロールの有効化状態を、任意のスレッドから自由に変更できるUIオブジェクトなしにバインドできます。

于 2012-07-20T13:23:05.080 に答える
1

UI スレッドでコードを同期的に実行していることを確認するには、Invoke代わりにを使用してくださいBeginInvoke

于 2012-07-20T13:20:10.543 に答える