如何将值返回到异步方法?

时间:2013-03-15 09:35:19

标签: c# asynchronous windows-phone-8 restsharp

当我调用此方法时,没有任何反应,应用程序崩溃。我认为应该使用ExecuteAsync方法。有人帮我吗?。这是我的代码。

CODE1

public Task<Connection> Connect(string userId, string password)
    {
        var client = new RestClient(_baseUrl)
            {
                Authenticator = new SimpleAuthenticator("user", userId,
                     "password", password)
            };
        var tcs = new TaskCompletionSource<Connection>();
        var request = new RestRequest(AppResources.Authenticating);
        client.ExecuteAsync<Connection>(request, response => tcs.SetResult(new 
               JsonDeserializer().Deserialize<Connection>(response)));
        return tcs.Task;
    }   

我也试过这段代码,但仍然存在同样的问题。

CODE2

public async Task<Connection> Connect(string userId, string password)
    {
        var client = new RestClient(_baseUrl)
            {
                Authenticator = new SimpleAuthenticator("user", userId,
                      "password", password)
            };
        var tcs = new TaskCompletionSource<Connection>();
        var request = new RestRequest(AppResources.Authenticating);
        client.ExecuteAsync<Connection>(request, response => tcs.SetResult(new 
                JsonDeserializer().Deserialize<Connection>(response)));
        Debug.WriteLine(tcs.Task.Result.Data);
        return await tcs.Task;
    }   

1 个答案:

答案 0 :(得分:2)

您不希望在异步代码中使用Task.ResultTask.Wait。这些成员仅在您使用Task作为任务并行库(编写并行代码)的一部分时使用。它们应该几乎不会在异步代码中使用。

在您的情况下,我怀疑您在Result返回的Task上调用Connect(或者可能在调用堆栈的后面)。这可以cause a deadlock,正如我在博客上解释的那样。

我不同意@LasseVKarlsen关于初学者的异步代码。我认为现在您应该学习新的async / await语言功能,这是绝对值得的。

我建议您从my introduction开始,然后使用MSDN docsTAP pattern。然后查看我的best practices article以避免最常见的陷阱。