C# 正在等待ExecuteAsync()结果

C# 正在等待ExecuteAsync()结果,c#,asynchronous,windows-phone-8,restsharp,C#,Asynchronous,Windows Phone 8,Restsharp,我的RestSharp实现有以下问题。在继续之前,如何让应用程序等待来自ExecuteAsync()的响应 我尝试了不同的解决方案: 首先(该方法不等待ExecuteAsync响应): 公共任务连接(字符串用户ID、字符串密码) { var client=new RestClient(_baseUrl) { Authenticator=新的SimpleAuthenticator(“用户”,userId, “密码”,密码) }; var tcs=new TaskCompletionSource()

我的RestSharp实现有以下问题。在继续之前,如何让应用程序等待来自
ExecuteAsync()
的响应

我尝试了不同的解决方案:

首先(该方法不等待ExecuteAsync响应):

公共任务连接(字符串用户ID、字符串密码)
{
var client=new RestClient(_baseUrl)
{
Authenticator=新的SimpleAuthenticator(“用户”,userId,
“密码”,密码)
};
var tcs=new TaskCompletionSource();
var请求=新的重新请求(AppResources.Authentication);
client.ExecuteAsync(请求、响应=>
{
SetResult(新的JsonDeserializer()。
反序列化(响应));
});
返回tcs.Task;
}   
所以我尝试了这个,但是应用程序冻结了:

   public Task<Connection> Connect(string userId, string password)
    {
        EventWaitHandle executedCallBack = new AutoResetEvent(false);
        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));
                executedCallBack.Set();
                });
        executedCallBack.WaitOne();
        return tcs.Task;
    }   
公共任务连接(字符串用户ID、字符串密码)
{
EventWaitHandle ExecuteCallback=new AutoResetEvent(false);
var client=new RestClient(_baseUrl)
{
Authenticator=新的SimpleAuthenticator(“用户”,userId,
“密码”,密码)
};
var tcs=new TaskCompletionSource();
var请求=新的重新请求(AppResources.Authentication);
client.ExecuteAsync(请求、响应=>
{
SetResult(新的JsonDeserializer()。
反序列化(响应));
executedCallBack.Set();
});
executedCallBack.WaitOne();
返回tcs.Task;
}   

我认为您错过了任务点和异步/等待模式

您不需要在这个方法中等待,但是因为您正在返回一个
任务
,所以如果它选择,它允许调用者异步等待它

调用者应该是这样的:

 public async void ButtonClick(object sender, RoutedEventArgs args)
 {
     Connection result = await restClient.Connect(this.UserId.Text, this.Password.Text);

      //... do something with result
 }
编译器知道如何使这段代码与同步(阻塞)代码非常相似,并将其转换为异步代码

请注意
async
wait
关键字,并注意
Task
已打开
Connection

鉴于此:您的第一个代码段看起来不错


当您引入另一种线程机制(即信号量
AutoResetEvent
)时,第二种机制可能会导致问题。此外,@HaspEmulator是正确的-如果这是在UI线程上,则会导致WP应用程序死锁。

我认为您缺少任务点和异步/等待模式

您不需要在这个方法中等待,但是因为您正在返回一个
任务
,所以如果它选择,它允许调用者异步等待它

调用者应该是这样的:

 public async void ButtonClick(object sender, RoutedEventArgs args)
 {
     Connection result = await restClient.Connect(this.UserId.Text, this.Password.Text);

      //... do something with result
 }
编译器知道如何使这段代码与同步(阻塞)代码非常相似,并将其转换为异步代码

请注意
async
wait
关键字,并注意
Task
已打开
Connection

鉴于此:您的第一个代码段看起来不错


当您引入另一种线程机制(即信号量
AutoResetEvent
)时,第二种机制可能会导致问题。此外,@haspmulator是正确的-如果这是在UI线程上,这会使WP应用程序死锁。

它来自
RestSharp
库,一种
WebClient
什么是连接?我在RestSharp中找不到这个类它来自
RestSharp
library,一种
WebClient
什么是连接?我在REST中找不到这个类。谢谢你的解决方案,但我仍然有同样的问题。方法
public Task Connect(string userId,string password){…}
return
tcs.Task
,无需等待执行
client.ExecuteAsync(…)
,因此结果总是空的yes这正是它应该做的。只有当你等待它时,你才会得到结果。谢谢你的解决方案,但我仍然有同样的问题。方法
public Task Connect(string userId,string password){…}
return
tcs.Task
,无需等待执行
client.ExecuteAsync(…)
,因此结果总是空的yes这正是它应该做的。只有在
等待它时,才会得到结果。