【发布时间】:2013-12-03 19:14:06
【问题描述】:
我正在使用一个 httpclient 实例向 rest web api 发送多个请求以获取数据。这是我的代码的样子:
首先我有一个控制层,它为数据调用数据层。
public class ControlLayer
{
protected DataLayer dal;
//constructors here
public int getInfo1(int param)
{
int ret = this.dal.getInfo1(param);
return ret;
}
public int getInfo2(int param)
{
int ret = this.dal.getInfo2(param);
return ret;
}
}
然后我有调用 webAPI 的 dataLayer,它看起来像这样。这里为简单起见,我直接使用 .result。
public class DataLayer
{
HttpClient client = new HttpClient();
string url = "";
public int getInfo1(int param1)
{
int ret=0;
HttpResponseMessage response = client.GetAsync(url).Result;
//.... do some work, get the value for ret
return ret;
}
public int getInfo2(int param1)
{
int ret = 0;
HttpResponseMessage response = client.GetAsync(url).Result;
//.... do some work, get the value for ret
return ret;
}
}
我的问题是,我看到一些教程说我们应该避免使用 .result,因为它可能会导致死锁。我不确定在我的情况下是否需要使用 异步/等待?如果我确实需要,我知道我应该一直异步,但我确实希望我的 controlLayer 是同步的,因为我有其他层调用 controlLayer 的函数,我不希望所有 layer 的函数都是异步的,结果是 Task,这是一种同步而不是异步的情况吗?我想念吗 某物?任何建议表示赞赏。谢谢!
【问题讨论】:
-
如果您不希望代码异步(是好是坏 - 您的个人电话),那么不要进行异步调用。不知道你有什么问题......
-
感谢您的快速回复,您是否建议直接使用 .result 函数?这会导致僵局吗?
-
@AlexeiLevenkov HttpClient 有一个异步 API,因此您必须使用
Result或await结果。 -
HttpClient不是那里唯一的 API...如果有人更喜欢同步代码WebRequest可能是另一种选择...但这完全取决于作者是否可以控制代码的使用位置(请参阅 sinelaw 的答案 +1 中的链接 - 如果是控制台应用程序同步等待异步方法是可以的,否则必须注意避免死锁。 -
@AlexeiLevenkov HttpClient 可能不是唯一的选择,但我仍然觉得它足够好,我不想想使用其他人。我如何让 HttpClient就像 像 WebClient 一样工作(同步),没有死锁的风险? (不过,我仍然想阻塞 UI 线程,直到请求完成)。
标签: c# async-await dotnet-httpclient