2010-01-29 Rolf Bjarne Kvinge <RKvinge@novell.com>
authorRolf Bjarne Kvinge <RKvinge@novell.com>
Thu, 28 Jan 2010 23:22:13 +0000 (23:22 -0000)
committerRolf Bjarne Kvinge <RKvinge@novell.com>
Thu, 28 Jan 2010 23:22:13 +0000 (23:22 -0000)
* 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.

svn path=/trunk/mcs/; revision=150512

mcs/class/System.Net/System.Net/ChangeLog
mcs/class/System.Net/System.Net/InternalWebRequestStreamWrapper.cs
mcs/class/System.Net/System.Net/WebClient_2_1.cs

index 4f3d76f1bd1b0a8d11ae5a1f6cfb0277831405c2..52d3efe897c9f79da25bfdf09841718f19f5c363 100644 (file)
@@ -1,3 +1,11 @@
+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
index 1c1c5c406f9767b81350922e0edf27f7bf8fa0c8..8271931a2641ed8fefcd7c07995ce557abc21c8b 100644 (file)
@@ -73,7 +73,7 @@ namespace System.Net {
                        finally {
                                // if used from WebClient then notify that the stream was closed
                                if (WebClient != null)
-                                       WebClient.WriteStreamClosedCallback ();
+                                       WebClient.WriteStreamClosedCallback (WebClientData);
                        }
                }
 
@@ -119,6 +119,10 @@ namespace System.Net {
                internal WebClient WebClient {
                        get; set;
                }
+
+               internal object WebClientData {
+                       get; set;
+               }
        }
 }
 
index be506f05031d012d0d4215f6418c8482b9d6e227..9873b48a5e0e66361cd80cafe6a7df5fbb71890a 100644 (file)
@@ -351,9 +351,13 @@ namespace System.Net {
                        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);
@@ -369,13 +373,15 @@ namespace System.Net {
                        }
                }
 
-               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);
                        }
                }
 
@@ -386,7 +392,9 @@ namespace System.Net {
                                ProcessResponse (response);
                        }
                        catch (Exception e) {
-                               OnWriteStreamClosed (new WriteStreamClosedEventArgs (e));
+                               ((CallbackData) result.AsyncState).sync_context.Post (delegate (object sender) {
+                                       OnWriteStreamClosed (new WriteStreamClosedEventArgs (e));
+                               }, null);
                        }
                }