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 には独自の最大制限があり、スレッドが残っていない場合はタスクをキューに入れることに気付いたので、コードからそのロジックを削除しました。