Ich mache einige asynchrone Netzwerk-I/O mit Begin/End-Stil-Methoden. (Es ist eigentlich eine Abfrage gegen Azure Table Storage, aber ich denke nicht, dass das eine Rolle spielt.) Ich habe ein clientseitiges Timeout mit der ThreadPool.RegisterWaitForSingleObject()
implementiert. Soweit ich weiß, funktioniert das gut.C#: Verwenden von RegisterWaitForSingleObject, wenn Vorgang zuerst
Da ThreadPool.RegisterWaitForSingleObject()
ein WaitHandle
als ein Argument dauert, muss ich die E/A-Operation beginnen, dann führen Sie ThreadPool.RegisterWaitForSingleObject()
. Es scheint, als ob dadurch die Möglichkeit eingeführt wird, dass die E/A abgeschlossen wird, bevor ich überhaupt die Wartezeit registriere.
Ein vereinfachte Codebeispiel:
private void RunQuery(QueryState queryState)
{
//Start I/O operation
IAsyncResult asyncResult = queryState.Query.BeginExecuteSegmented(NoopAsyncCallback, queryState);
//What if the I/O operation completes here?
queryState.TimeoutWaitHandle = ThreadPool.RegisterWaitForSingleObject(asyncResult.AsyncWaitHandle, QuerySegmentCompleted, asyncResult, queryTimeout, true);
}
private void QuerySegmentCompleted(object opState, bool timedOut){
IAsyncResult asyncResult = opState as IAsyncResult;
QueryState state = asyncResult.AsyncState as QueryState;
//If the I/O completed quickly, could TimeoutWaitHandle could be null here?
//If so, what do I do about that?
state.TimeoutWaitHandle.Unregister(asyncResult.AsyncWaitHandle);
}
Was ist der richtige Weg, dies zu umgehen? Muss ich mich noch Sorgen machen über Unregister()
den AsyncWaitHandle? Wenn ja, gibt es einen ziemlich einfachen Weg, darauf zu warten, dass es gesetzt wird?
Haben Sie versucht, einen 'Thread.Sleep' in der Mitte einzufügen, damit die E/A-Operation abgeschlossen werden kann, und sehen Sie, was passiert? – mellamokb
habe ich nicht. Ich denke, ich habe das nur vielleicht 3-4 Mal gesehen, und dann nur auf stark belasteten Produktionsmaschinen. Ich würde lieber nicht beginnen, Sleep() -Aufrufe in meinen echten Code einzufügen. –
Testen Sie es natürlich in Ihrer Entwicklungsumgebung. Wenn du sagst, dass du das nur 3-4 mal gesehen hast, was hast du gesehen? Eine zufällige unerklärte NullPointerException? – mellamokb