我已经调整了以下代码,尝试从Wasson的asp.net代码的web api加载。如何测试以确保此代码真正运行异步?
static public async Task<IEnumerable<T>> ExecuteAsync(HttpClient client, String endPoint)
{
IEnumerable<T> result = null;
HttpResponseMessage response = client.GetAsync(endPoint).Result;
response.EnsureSuccessStatusCode();
if (response.IsSuccessStatusCode)
{
var tResult = await response.Content.ReadAsStringAsync();
result = JsonConvert.DeserializeObject<IEnumerable<T>>(tResult);
}
return result;
}
当我有它的设计,我觉得这个过程将异步运行,但我不知道如何测试它,以确保它。
我是使用异步编码的新手,所以任何建议都会有所帮助。
调用过程如下:
public virtual IEnumerable<T> Fill()
{
IEnumerable<T> result = null;
try
{
using (var client = CreateClient("", new MediaTypeWithQualityHeaderValue("application/json")))
{
String _endPoint = "api/" + typeof(T).Name + "/Get";
result = (ExecuteAsync(client, _endPoint)).Result;
}
}
catch (Exception ex)
{
LogError(ex.Message);
}
return result;
}
是这个组合可能因为我希望它异步运行?
我希望能够异步运行的原因是,填充程序获取大量的数据库中的数据的。对于每条记录来说,更多的情况是大量的单个记录而不是大的记录,尽管一些记录的大小也可能是一个问题。
我不想坐在那里等待整个页面与数据库通信正在发生加载用户。
这并不重要,在这种情况下,我是否直接连接到数据库或通过我使用的网络API会:这需要在某些情况下,无论哪种方式,很长一段时间。
我也很关心死锁:一个大的取进来,而另一个正在等待。
我最初构图之后麦克沃森的示例代码的代码,却发现代码,即使它编译无限期忌用。
这是否有助于改善情况?
编号'.Result'使其成为阻塞呼叫。 'Fill'应该标记为'async',以便您可以调用'result = await ExecuteAsync(client,_endpoint);' –
在Visual Studio中,我相信您的输出会告诉您何时使用的线程正在退出。这就是我一直看到的,如果异步实际上是创建线程。我的逻辑可能是错误的,但如果它没有在那里显示多个线程,那么我认为它没有......并且到目前为止它是正确的。 – trueCamelType
至于测试一些建议。起初,我陷入陷阱使用'await Task.Delay(TimeInMillisecondsHere)',但后来意识到,你需要一个阻止操作来实际测试,所以现在使用for循环像'for(int i = 0; i
kirotab