4

スレッドを使用する場合、「クロススレッド」を回避するために「invoke」が使用されます(1)

ただし、「CrossThread」を回避するために「タイマーオブジェクト」が使用されている場合があります(2)

このように(例えば)

public partial class Form1 : Form
{

    private bool bCheckState = false;

    public Form1()
    {
        InitializeComponent();
    }

    //Button Click
    private void btnWork_Click(object sender, EventArgs e)
    {
        Thread m_Thread = new Thread(new ThreadStart(Work));
        m_Thread.Start();

    }

    private void Work()
    {
        bCheckState = true;            
        // not use invoke 
    }


    private void timer_Tick(object sender, EventArgs e)
    {
        if (bCheckState)
        {
            //tbxDisplay is winform's textBox control - printing data
            tbxDisplay.Text = bCheckState.ToString();
            bCheckState = false;
        }
    }
}

どちらがより効果的ですか?「(1)と(2)の間」


'invoke'または他のメソッドを使用せずに、'timerイベント'でチェックした後、'thread'内で処理されたデータを分散させると問題になる可能性がありますか?(「スレッド」内で処理されたデータを印刷するときに「クロススレッド」を回避するために、「タイマーイベント」でデータを追加の「タイマーオブジェクト」とともに分散させることは、有益でも有害でもないため、頻繁に使用されていると聞きました)。

4

2 に答える 2

5

BackgroundWorkerインスタンスを使用して、すでに適切なスレッドにあるReportProgressand/orイベントを処理するだけです。RunWorkerCompleted

于 2012-01-16T07:14:31.810 に答える
1

Ben Voigt が示唆したように、BackgroundWorker他の何かを使用したい正当な理由がない限り、おそらく a をここで使用する必要があります。

「効果的」というのは、かなりあいまいな比較手段です。検討している 2 つのオプションで何を探しているのかが完全に明確ではありません。

BackgroundWorkerシンプルで理解しやすく、タイマーを使用しません。

InvokebCheckState が true になってからテキストが更新されるまでの遅延が少ないという意味で、タイマーよりも効果的です。また、設定された間隔でタイマーをポーリングしないため、CPU の負荷も少なくなります。

Timer、テキストを更新するために呼び出し中にスレッドを停止する必要がないという意味でより効果的ですが、ブール値が変更されたかどうかをチェックするために CPU 時間を浪費するため、少し非効率的です。フォームが変更される前に、タイマー間隔の長さまでの遅延。

別の方法としてBeginInvoke、タイマーを使用せずに、スレッドが呼び出しの完了を待たずにフォームを更新するために使用できます。ただし、例外が発生した場合はEndInvoke、呼び出しが完了するまでスレッドの実行も停止する も呼び出さない限り、スレッドは検出されない可能性があります。

それらにはすべて長所と短所があり、一般的に特定のものをより「効果的」と呼ぶことはできません.

于 2012-01-17T00:10:32.183 に答える