using System.IO;
using System.Text;
+using System.Threading;
namespace System.Net {
is_busy = false;
}
+ class CallbackData {
+ public object user_token;
+ public SynchronizationContext sync_context;
+ public byte [] data;
+ public CallbackData (object user_token, byte [] data)
+ {
+ this.user_token = user_token;
+ this.data = data;
+ this.sync_context = SynchronizationContext.Current ?? new SynchronizationContext ();
+ }
+ public CallbackData (object user_token) : this (user_token, null)
+ {
+ }
+ }
+
// DownloadStringAsync
public void DownloadStringAsync (Uri address)
try {
request = SetupRequest (address, "GET");
- request.BeginGetResponse (new AsyncCallback (DownloadStringAsyncCallback), userToken);
+ request.BeginGetResponse (new AsyncCallback (DownloadStringAsyncCallback), new CallbackData (userToken));
}
catch (Exception e) {
WebException wex = new WebException ("Could not start operation.", e);
private void DownloadStringAsyncCallback (IAsyncResult result)
{
+ CallbackData callback_data = (CallbackData) result.AsyncState;
string data = null;
Exception ex = null;
bool cancel = false;
ex = e;
}
finally {
- OnDownloadStringCompleted (
- new DownloadStringCompletedEventArgs (data, ex, cancel, result.AsyncState));
+ callback_data.sync_context.Post (delegate (object sender) {
+ OnDownloadStringCompleted (new DownloadStringCompletedEventArgs (data, ex, cancel, callback_data.user_token));
+ }, null);
}
}
try {
request = SetupRequest (address, "GET");
- request.BeginGetResponse (new AsyncCallback (OpenReadAsyncCallback), userToken);
+ request.BeginGetResponse (new AsyncCallback (OpenReadAsyncCallback), new CallbackData (userToken));
}
catch (Exception e) {
WebException wex = new WebException ("Could not start operation.", e);
private void OpenReadAsyncCallback (IAsyncResult result)
{
+ CallbackData callback_data = (CallbackData) result.AsyncState;
Stream stream = null;
Exception ex = null;
bool cancel = false;
ex = e;
}
finally {
- OnOpenReadCompleted (
- new OpenReadCompletedEventArgs (stream, ex, cancel, result.AsyncState));
+ callback_data.sync_context.Post (delegate (object sender) {
+ OnOpenReadCompleted (new OpenReadCompletedEventArgs (stream, ex, cancel, callback_data.user_token));
+ }, null);
}
}
try {
request = SetupRequest (address, method);
- request.BeginGetRequestStream (new AsyncCallback (OpenWriteAsyncCallback), userToken);
+ request.BeginGetRequestStream (new AsyncCallback (OpenWriteAsyncCallback), new CallbackData (userToken));
}
catch (Exception e) {
WebException wex = new WebException ("Could not start operation.", e);
private void OpenWriteAsyncCallback (IAsyncResult result)
{
+ CallbackData callback_data = (CallbackData) result.AsyncState;
Stream stream = null;
Exception ex = null;
bool cancel = false;
ex = e;
}
finally {
- OnOpenWriteCompleted (
- new OpenWriteCompletedEventArgs (stream, ex, cancel, result.AsyncState));
+ callback_data.sync_context.Post (delegate (object sender) {
+ OnOpenWriteCompleted (new OpenWriteCompletedEventArgs (stream, ex, cancel, callback_data.user_token));
+ }, null);
}
}
try {
request = SetupRequest (address, method);
- object[] bag = new object [] { encoding.GetBytes (data), userToken };
-
- request.BeginGetRequestStream (new AsyncCallback (UploadStringRequestAsyncCallback), bag);
+ request.BeginGetRequestStream (new AsyncCallback (UploadStringRequestAsyncCallback), new CallbackData (userToken, encoding.GetBytes (data)));
}
catch (Exception e) {
WebException wex = new WebException ("Could not start operation.", e);
private void UploadStringRequestAsyncCallback (IAsyncResult result)
{
try {
- object[] bag = (result.AsyncState as object[]);
- byte[] data = (bag [0] as byte[]);
+ CallbackData callback_data = (CallbackData) result.AsyncState;
Stream stream = request.EndGetRequestStream (result);
- stream.Write (data, 0, data.Length);
- request.BeginGetResponse (new AsyncCallback (UploadStringResponseAsyncCallback), bag [1]);
+ stream.Write (callback_data.data, 0, callback_data.data.Length);
+ request.BeginGetResponse (new AsyncCallback (UploadStringResponseAsyncCallback), callback_data);
}
catch {
request.Abort ();
private void UploadStringResponseAsyncCallback (IAsyncResult result)
{
+ CallbackData callback_data = (CallbackData) result.AsyncState;
string data = null;
Exception ex = null;
bool cancel = false;
ex = e;
}
finally {
- OnUploadStringCompleted (
- new UploadStringCompletedEventArgs (data, ex, cancel, result.AsyncState));
+ callback_data.sync_context.Post (delegate (object sender) {
+ OnUploadStringCompleted (new UploadStringCompletedEventArgs (data, ex, cancel, callback_data.user_token));
+ }, null);
}
}