+2010-01-29 Rolf Bjarne Kvinge <RKvinge@novell.com>
+
+ * WebClient_2_1.cs: Ensure the WriteStreamClosed event is emitted on
+ the correct thread (by using the stored SynchronizationContext).
+
+ * InternalWebRequestStreamWrapper.cs: Add a WebClientData field which
+ is passed to the WriteStreamClosedCallback.
+
2010-01-28 Rolf Bjarne Kvinge <RKvinge@novell.com>
* WebClient_2_1.cs: The async events must be invoked on a threadpool
finally {
// if used from WebClient then notify that the stream was closed
if (WebClient != null)
- WebClient.WriteStreamClosedCallback ();
+ WebClient.WriteStreamClosedCallback (WebClientData);
}
}
internal WebClient WebClient {
get; set;
}
+
+ internal object WebClientData {
+ get; set;
+ }
}
}
Stream stream = null;
Exception ex = null;
bool cancel = false;
+ InternalWebRequestStreamWrapper internal_stream;
+
try {
stream = request.EndGetRequestStream (result);
- (stream as InternalWebRequestStreamWrapper).WebClient = this;
+ internal_stream = (InternalWebRequestStreamWrapper) stream;
+ internal_stream.WebClient = this;
+ internal_stream.WebClientData = callback_data;
}
catch (WebException web) {
cancel = (web.Status == WebExceptionStatus.RequestCanceled);
}
}
- internal void WriteStreamClosedCallback ()
+ internal void WriteStreamClosedCallback (object WebClientData)
{
try {
- request.BeginGetResponse (OpenWriteAsyncResponseCallback, null);
+ request.BeginGetResponse (OpenWriteAsyncResponseCallback, WebClientData);
}
catch (Exception e) {
- OnWriteStreamClosed (new WriteStreamClosedEventArgs (e));
+ ((CallbackData) WebClientData).sync_context.Post (delegate (object sender) {
+ OnWriteStreamClosed (new WriteStreamClosedEventArgs (e));
+ }, null);
}
}
ProcessResponse (response);
}
catch (Exception e) {
- OnWriteStreamClosed (new WriteStreamClosedEventArgs (e));
+ ((CallbackData) result.AsyncState).sync_context.Post (delegate (object sender) {
+ OnWriteStreamClosed (new WriteStreamClosedEventArgs (e));
+ }, null);
}
}