0

i am working on web services...
below is the method i have written to call a web service

 long UserID = CheckIfUserExist(temp);       
    if (UserID == -1)
           // WRONG RESULT <---
    else
          // RIGHT RESULT <---

the CheckIfUserExist method calling that web service and returning the output value (UserID)--->

public static long CheckIfUserExist()
{                
     long UserID = -1;
     client.GetAsync("me");  
     client.GetCompleted += (o, e) =>
     {
         // some code
         if (Convert.ToInt64(eargs.Result) == 0)
         {
               UserID = Convert.ToInt64(eargs.Result);
         }
         return UserID;
     }
 }

but the CheckIfUserExist returning an output value befor exceuting the GetCompleted & its always going wrong result...

i also tried manualResetEvent, but its blocking my UI Thread... so not worked

so any one have any idea to fix this ?

svick
  • 236,525
  • 50
  • 385
  • 514
Ashok Damani
  • 3,896
  • 4
  • 30
  • 48

2 Answers2

3

Async Await keywords are one way to solve your situation. However your actual problem is you dont understand how the GetAsync call works. When you say:

public static long CheckIfUserExist()
{                
     long UserID = -1;
     client.GetAsync("me");  
     client.GetCompleted += (o, e) =>
     {
         // some code
         if (Convert.ToInt64(eargs.Result) == 0)
         {
               UserID = Convert.ToInt64(eargs.Result);
         }
         return UserID;
     }
 }

It is equivalent to:

    public static long CheckIfUserExist()
    {                
     long UserID = -1;
     client.GetAsync("me");  
     client.GetCompleted += MyEventHandler;

    }

    void MyEventHandler(object sender, SomeEventArgs e)
    {
         // some code
         if (Convert.ToInt64(eargs.Result) == 0)
         {
           UserID = Convert.ToInt64(eargs.Result);
         }
         return UserID; // <-- WHAT IS POINT OF RETURNING UserID FROM HERE?? 
                        // method maybe running on some other thread asynchronously to UI thread
    }

There are two possibilities for you: If your client object's GetCompleted event occurs on the UI thread you can do this:

 client.GetCompleted += (o, e) =>
         {
             // some code
             if (Convert.ToInt64(eargs.Result) == 0)
             {
               UserID = Convert.ToInt64(eargs.Result);
             }
             // your logic here
             if (UserID == -1)
                  // WRONG RESULT <---
             else
                  // RIGHT RESULT <---
         }

If GetCompleted event does not occur on UI thread:

client.GetCompleted += (o, e) =>
             {
                 // some code
                 if (Convert.ToInt64(eargs.Result) == 0)
                 {
                   UserID = Convert.ToInt64(eargs.Result);
                 }
                 // let UI thread know we've got the result
                 Dispatcher.Invoke( (Action)(() => { NotifyUIThread(UserID) } ));
             }
...

void NotifyUIThread(long UserId) //This runs on UI thread
{
    if (UserID == -1)
       // WRONG RESULT <---
    else
       // RIGHT RESULT <---

}

Also, take care there you subscribe to event before you call GetAsync

client.GetCompleted += (o, e) => { ... } //subscribe first
client.GetAsync("me");  // call GetAsync later

If on WP7 - you may have problem with Dispatcher.Invoke see this: Can't use dispatcher on WP7

Community
  • 1
  • 1
YK1
  • 7,327
  • 1
  • 21
  • 28
1

Yes I suggest you use the "await"-"async" technology . To make sure that the function is completly finished before continuing code .

Here is what your code should look like :

more info here -> http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx

public async void updateUser()
{
   long UserID = await CheckIfUserExist(temp);       
   if (UserID == -1)
       // WRONG RESULT <---
   else
      // RIGHT RESULT <---
}

public async Task<long> CheckIfUserExist()
{                
     long UserID = -1;
     await client.GetAsync("me");  
     client.GetCompleted += (o, e) =>
     {
         // some code
         if (Convert.ToInt64(eargs.Result) == 0)
         {
               UserID = Convert.ToInt64(eargs.Result);
         }
         return UserID;
     }
 }
Mehdi Bugnard
  • 3,889
  • 4
  • 45
  • 86