2

当我调用此方法时,什么也没有发生,应用程序崩溃。我认为这是由于ExecuteAsync方法。有人可以帮助我吗?这是我的代码。

代码1

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;
    }   

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

代码2

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;
    }   
4

1 回答 1

2

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

在您的情况下,我怀疑您正在调用返回的Result(或可能进一步调用堆栈)。正如我在博客中解释的那样,这可能会导致死锁。TaskConnect

对于初学者的异步代码,我不同意@LasseVKarlsen。我认为现在新的async/await语言功能已经发布,您绝对应该学习它。

我建议您从我的介绍开始,然后跟进MSDN 文档TAP 模式。然后查看我的最佳实践文章以避免最常见的陷阱。

于 2013-03-15T11:55:14.997 回答