2

ワーカースレッドの実行がいつ完了したかを知るためのエレガントな方法はありますか?それにより、ワーカースレッドが生成したリソースにアクセスできますか?

たとえば、ワーカースレッドがを使用してSQLServerのリストを照会した場合

ServersSqlDataSourceEnumerator.Instance.GetDataSources();

結果をDataTable変数に保存しました。このデータテーブル変数がいつ入力されたか、または使用可能になるかを知るために、どのメカニズムを使用できますか。ThreadStateをポーリングしたくありません。イベントが完了したらイベントを発生させて、結果を使用してアクションを実行できるようにするのが理想的です。

ありがとう!

4

5 に答える 5

5

コールバックメカニズムまたはイベントのブロックを使用して、非同期操作の完了を知ることができます。.netの非同期プログラミングモデルについては、このページを参照してください。任意のデリゲートでBeginInvokeを呼び出して、非同期でアクションを実行できます。

BackgroundWorkerタイプを使用している場合は、RunWorkerCompletedイベントをサブスクライブできます。

于 2009-06-03T14:37:25.957 に答える
1

だからイベントを発射する:-P

AutoResetEventの使用も確認できます:http:
//msdn.microsoft.com/en-us/library/system.threading.autoresetevent.aspx

于 2009-06-03T14:36:21.920 に答える
1

この例で私が行うことは、WorkerThreadが作業の完了後に関数を呼び出すようにすることです。これにより、UIスレッドが呼び出され、必要な作業を実行できます。

例えば

private void SetWorkerThreadToDoWork()
{
  WorkerThread.Start();
}

private void MyWorkerThreadWork()
{
  //This will be on the WorkerThread (called from WorkerThread.Start())
  DoWorkFunc();
  WorkComplete();
}

private void WorkComplete()
{
  if(InvokeRequired == true)
  {
    //Do the invoke
  }
  else
  {
  //Check work done by worker thread
  //e.g. ServersSqlDataSourceEnumerator.Instance.GetDataSources();
  }
}

使用している単純なプロセスの場合は、BackgroundWorkerThreadを使用します。これには、作業が完了したときに発生する独自のイベントが付属しています。ただし、スレッドを使用する必要がある場合は、非同期コールバックまたは上記と同様のルートを調べます。

于 2009-06-03T14:43:51.327 に答える
1

このSOスレッドで私の答えを確認できます

コールバックメカニズムを使用します。非同期操作が実行されると、SQL実行後に実行する必要のある処理を処理できるコールバックメソッドが起動されます。

同様のアプローチを使用して、非同期操作が実行されたときに通知を受け取ります。

お役に立てれば :)

于 2009-06-03T17:33:49.780 に答える
0

私はC#でプログラミングしていませんが、Delphiで行ったことは次のとおりです。おそらく、C#でも同様に行うことができます。私にはTThreadの子孫がいて、「破棄」イベントで、「やあ、もうすぐ死ぬぞ!」というメッセージを作成者に送信します。このようにして、その親(メインスレッド)は、新しいスレッドが必要な場合に新しいスレッドを作成します。正確には、タイマーを起動し、起動すると、新しいスレッドが必要になった場合に新しいスレッドを作成します(サイトは時間を吸います(笑)!!)。

于 2009-06-03T14:37:56.987 に答える