gpt4 book ai didi

c# - 等待 ExecuteAsync() 结果

转载 作者:行者123 更新时间:2023-11-30 20:59:36 25 4
gpt4 key购买 nike

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

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

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

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

所以我尝试了这个,但是应用程序卡住了:

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

最佳答案

我认为您忽略了 Task 和异步/等待模式的要点。

你不会在这个方法中等待,而是因为你要返回一个 Task<>如果选择,它允许调用者异步等待它。

来电者会是这样的:

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

//... do something with result
}

编译器知道如何将这段与同步(阻塞)等价物非常相似的代码变成异步代码。

注意 asyncawait关键字,并注意 Task<Connection>已交Connection .

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

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

关于c# - 等待 ExecuteAsync() 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15434983/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com