2015-10-14 48 views
0

我想/想等到异步任务在这里完成的是什么我试图做如何等待,直到UploadStringAsync方法完成

public class savetodbsingle 
{ 
    public static string insert(string id, string type, string cat) 
    { 
     Uri uri = new Uri("http://yxz.com"); 

     WebClient wc = new WebClient(); 
     wc.Headers[HttpRequestHeader.ContentType] = "application/json"; 
     wc.UploadStringAsync(uri, "POST", json); 

     wc.UploadStringCompleted += wc_UploadComplete6; 
    } 

    private static void wc_UploadComplete6(object sender, UploadStringCompletedEventArgs e) 
    { 
     //Saving to database logic here 
    } 
} 

,并从其他网页

//calling method 
savetodbsingle.insert(id,type,cat)); 

// i want to show messegebox from here when above task completes 
MessegeBox.Show("Completed"); 

调用方法那么如何实现这一目标呢?我曾试图让异步方法,然后等待,但没有帮助

+0

解决方案你有机会获得['UploadStringTaskAsync'](HTTPS ://msdn.microsoft.com/en-us/library/hh138531(v = vs.110).aspx)在Windows Phone?如果没有,你有权访问类['TaskCompletionSource'](https://msdn.microsoft.com/en-us/library/dd449174(v = vs.110).aspx)? –

+0

不,我没有访问它,我不知道TaskCompletionsource @ScottChamberlain – SD7

+0

它给错误无法等待void @Eldho – SD7

回答

1

使用替代UploadStringTaskAsync方法

这将返回您可以等待任务。

https://msdn.microsoft.com/en-us/library/hh159423%28v=vs.110%29.aspx

public static async string insert(string id, string type, string cat, Action<object,Exception> callback) 
    { 
     ---- 
     string result = await wc.UploadStringTaskAsync(uri, "POST", json); 

    } 
+0

你的代码并不完全是解决方案,但我已经使用UploadStringTaskAsync作为所述并且实现了相同的 – SD7

+0

糟糕,你必须将方法标记为异步,我的不好。 – Igoy

+0

检查我的答案@Igoy – SD7

2

我不知道是否WebClient.UploadStringTaskAsync带有Microsoft.Bcl.Async为Windows Phone 8的,但如果有人想知道它是如何实现的,以及如何使用TaskCompletionSource ,这里是它的实现,取自the source

[HostProtection(ExternalThreading = true)] 
[ComVisible(false)] 
public Task<string> UploadStringTaskAsync(Uri address, string method, string data) 
{ 
    // Create the task to be returned 
    var tcs = new TaskCompletionSource<string>(address); 

    // Setup the callback event handler 
    UploadStringCompletedEventHandler handler = null; 
    handler = (sender, e) => HandleCompletion(tcs, e, (args) => args.Result, handler, (webClient, completion) => webClient.UploadStringCompleted -= completion); 
    this.UploadStringCompleted += handler; 

    // Start the async operation. 
    try { this.UploadStringAsync(address, method, data, tcs); } 
    catch 
    { 
     this.UploadStringCompleted -= handler; 
     throw; 
    } 

    // Return the task that represents the async operation 
    return tcs.Task; 
} 
1

你可以使用回调来实现。您如何定义回调取决于您。作为一个例子,我将它定义为一个Action,它带有两个参数:一个对象,可以用来给调用者一些东西,还有一个异常以防万一在保存期间出错。

public class savetodbsingle 
{ 
    private Action<object, Exception> _callback; 

    public static string insert(string id, string type, string cat, Action<object,Exception> callback) 
    { 
     Uri uri = new Uri("http://yxz.com"); 

     WebClient wc = new WebClient(); 
     wc.Headers[HttpRequestHeader.ContentType] = "application/json"; 
     wc.UploadStringCompleted += wc_UploadComplete6; 

     _callback = callback; 

     wc.UploadStringAsync(uri, "POST", json); 

    } 

    private static void wc_UploadComplete6(object sender, UploadStringCompletedEventArgs e) 
    { 
     //Saving to database logic here 

     // When done, you can return something if needed 
     // or return an exception when something bad happened. 
     _callback(someObject, someException) 
    } 
} 

,并呼吁其他页面的方法

//calling method 
savetodbsingle.insert(id,type,cat, handleSaved)); 

private void handleSaved(object o, Exception e) 
{ 
    MessegeBox.Show("Completed"); 
} 
1

这是我如何实现它

public static async Task insert(string id, string type, string cat) 
      { 
     WebClient wc = new WebClient(); 
       wc.Headers[HttpRequestHeader.ContentType] = "application/json"; 


      var responce=  await wc.UploadStringTaskAsync(uri, "POST", json); 
      jsons = responce.ToString().Trim(); 

      saving();//save to database logic here 
    } 

并调用方法这样

await savetodbsingle.insert(id, type, cat); 
Messegebox.Show("Completed");