0

UI (メイン) スレッドから呼び出されていた次の関数があります。

    private void BreakToggle(int line, Boolean toggle)
    {
        string flag;
        if (toggle)
        {
            flag = "0"; //Add
        }
        else
        {
            flag = "1"; //Delete
        }
        string logicLine = line.ToString();

        SetLogicBreakLineResponse response = ddcdao.SetLogicBreakLine(logicName, logicLine, flag);
    }

ただし、最終的には電子デバイスとの接続を確立して信号を送信しようとしますが、接続が遅い場合は最大 5 秒かかる場合があります。そのため、UI がハングしないようにするために、これを処理する別のスレッドを作成することにしました。

この関数は短時間に何度も呼び出すことができるので (たとえば、1 秒間に 10 回)、バックグラウンド ワーカーにこれを処理させる代わりに、Threadpool を使用する必要があると考え、コードを次のように変更しました。

 ThreadPool.QueueUserWorkItem(state =>
 {
        SetLogicBreakLineResponse response = ddcdao.SetLogicBreakLine(logicName, logicLine, flag);
 });

それは Threadpool を使用する適切な方法ですか? スレッドがこんなに簡単に使えるとしたら、私は間違いなく何か間違ったことをしているような気がします。このコードは、アプリケーションに未知のブードゥーを引き起こしますか?

4

2 に答える 2

2

あなたの例は、スレッドプールを使用するための合理的な開始です。UI スレッドの外部でコードを実行することだけに関心がある場合は、それと同じくらい簡単です。

ただし、元のコードとマルチスレッド バージョンの動作の違いに注意する必要があります。

  • MT バージョンは、キューに入れられた操作がどの順序で実行されるかを保証しません。
  • MT バージョンでは、一度に複数の操作を実行できる可能性があります。つまり、SetLogicBreakLine は再入可能である必要があります。
  • クロージャーを使用して参照型の値を取得すると、スケジュールした後、実行する前にメンバーが変更される可能性があります

これらの違いについて考える必要はありますが、MT の動作に問題がなければ、簡単です。

于 2012-09-03T08:44:13.163 に答える
1

スレッドがこんなに簡単に使えるとしたら、私は間違いなく何か間違ったことをしているような気がします。

ThreadPool の要点は、スレッドをより効率的かつ簡単に使用できるようにすることです。response私が言う唯一のことは、スレッドの外側を利用する必要がある場合は、おそらくコードを再考する必要があるということです.

于 2012-09-03T08:41:53.170 に答える