1

Completion Service を使用して、呼び出しによってパケットを受信するサードパーティ アプリにクエリを送信する Java の例に従っています。

completionService.submit(new FetchData());

次に、次のように呼び出します。

Future<Data> future  = completionService.take();
Data data = future.get(timeout, TimeUnit.MILLISECONDS);

サブミットされたタスクの 1 つが終了するのを待って、データを返します。これら 2 つの呼び出しはwhile(true)ループしています。

私はc#でアプリを開発していますが、これがパケットを待つ適切な方法であるかどうか、そしてc#でそれを行う方法であるかどうか疑問に思っていました.

私はこれを試しましたが、それが正しいかどうかはわかりません:

new Thread(delegate() {
  Dictionary<ManualResetEvent, FetchData> dataDict = new Dictionary<ManualResetEvent, FetchData>();

  ManualResetEvent[] doneEvents;
  ManualResetEvent doneEvent;
  FetchData fetch;
  int index;

  while(true) {             
    // Create new fetch
    doneEvent = new ManualResetEvent(false);
    fetch = new FetchData(this, doneEvent);

    // event -> fetch association
    dataDict.Add(doneEvent, fetch);

    ThreadPool.QueueUserWorkItem(fetch.DoWork);

    doneEvents = new ManualResetEvent[dataDict.Count];
    dataDict.Keys.CopyTo(doneEvents, 0);

    // wait for any of them to finish
    index = WaitHandle.WaitAny(doneEvents, receiveThreadTimeout);

    // did we timeout?
    if (index == WaitHandle.WaitTimeout) {
      continue;
    }

    // grab done event
    doneEvent = doneEvents[index];
    // grab fetch
    fetch = dataDict[doneEvent];

    // remove from dict
    dataDict.Remove(doneEvent);

    // process data
    processData(fetch.GetData());               
  }

}).Start();

編集:最後の注意点として、私はこれを Unity で使用しています。Unity は Mono 2.6 を使用し、.NET 2.0 に制限されています。

EDIT 2:コードをいくつか変更しました。ThreadPool には独自の最大制限があり、スレッドが残っていない場合はタスクをキューに入れることに気付いたので、コードからそのロジックを削除しました。

4

2 に答える 2

0

Unity3D アプリケーションで本当にマルチスレッドを使用する必要がありますか? Unity はマルチスレッド「ではない」ため、これを尋ねています。スレッドを処理する方法はありますが、これを行うにはコルーチンに依存することをお勧めします。コルーチンの詳細については、このドキュメントを参照してください。

1 つの注意: Unity 3.5 を使用している場合は、.NET 4.0 のほぼすべてをサポートする Mono 2.6.5 を使用します。クラスについてはわかりませんTaskが、確かに .NET 3.0 をカバーしています。

于 2012-08-29T21:02:53.833 に答える
0

パケットをリッスンするために必要なスレッドは 1 つだけであることが判明したため、上記の例のようにスレッド プールを使用する必要はありません。

于 2012-08-30T01:16:29.823 に答える