I am developing a C# Winforms application, part of the application will be uploading files to a webserver using AsyncUpload (using it,due to the need to use a porgress callback) , In the C# program
i got a simple for loop that calls The Uploading function
 for(int i=0;i < 10 ; i++)
{
  Uploadfun();
}
And the fun does some magic:
Uploadfun()
  { 
  // Logic comes here
   // webClient.UploadFileAsync runs a 2nd thread to perform upload .. 
   webClient.UploadFileAsync(uri, "PUT", fileNameOnHD);  
 }
And a callback that gets called when the Async upload is done
Upload_Completed_callback()
{
  //Callback event
}
Edit
The logic sequence:
The problem is on the 3rd point, when the execution moves back to the for loop, i need to block the loop from continuing until the callback get called.
In C# methods block by default, so you shouldn't need to do anything. I'm assuming that for some reason you are calling a non-blocking method that starts a background task / thread / whatever and gives you a callback when it's done. You want to call this asynchonous method in a synchronous manner.
You can call fun from inside the callback. Something along these lines (pseudo-code):
int n;
callFunTenTimes()
{
    n = 0;
    fun(n);
}
callback()
{
    ++n;
    if (n < 10)
       fun(n);
    else
       print("done");
}
This is similar to continuation passing style.
An advantage to this method is that you can also make your method asynchronous without adding any extra threads, locks, or extra logic - you just supply a callback function which your client can subscribe to. It works well in an event-driven environment.
So if I understand correctly, you want to call UploadFileAsync then block until the async call has hit your callback. If so, I'd use AutoResetEvent i.e  
private readonly AutoResetEvent _signal = new AutoResetEvent(false); 
fun()
  { 
  // Logic comes here
   // runs a 2nd thread to perform upload .. calling "callback()" when done
   webClient.UploadFileAsync(uri, "PUT", fileNameOnHD);  
   _signal.WaitOne();   // wait for the async call to complete and hit the callback     
 }
callback()
 {
   //Callback event
   _signal.Set(); // signal that the async upload completed
 }
Using AutoResetEvent means that the state gets automatically reset after Set has been called and a waiting thread receives the signal via WaitOne
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With