我正在使用async-await方法创建一个应用程序。但是使用它们对我来说存在很大问题。在阅读了几篇文章后,我仍然不知道将重同步操作包装到异步方法的最佳方法是什么。
我有两个想法。哪一个最好?
1)当前的实现。
private Task<List<UploadedTestModel>> ParseTestFiles(List<string> filesContent)
{
var tcs = new TaskCompletionSource<List<UploadedTestModel>>();
Task.Run(() =>
{
var resultList = new List<UploadedTestModel>();
foreach (var testBody in filesContent)
{
try
{
var currentCulture = Thread.CurrentThread.CurrentCulture;
var serializerSettings = new JsonSerializerSettings
{
Culture = currentCulture
};
var parsedData = JsonConvert.DeserializeObject<UploadedTestModel>(testBody, serializerSettings);
resultList.Add(parsedData);
}
catch(Exception exception)
{
tcs.SetException(exception);
}
}
tcs.SetResult(resultList);
});
return tcs.Task;
}
我正在使用Task.Run和TaskCompletionSource
2)仅使用Task.Run而不使用TaskCompletionSource
private Task<List<UploadedTestModel>> ParseTestFiles(List<string> filesContent)
{
return Task.Run(() =>
{
. . . .
return resultList;
});
}
答案 0 :(得分:17)
我不会用。对于调用方法调用的人,你会撒谎。当您公开异步操作时,调用者希望它自然是异步的,这意味着它背后没有线程正在工作。
您的所有方法都是继承同步的,您应该将它们公开。将它留给调用者来决定是否要同步调用它们或使用线程并将其排队,不要为它们做出决定。
Stephan Toub撰写了一篇名为Should I expose asynchronous wrappers for synchronous methods?的文章,其中讨论了不做你想要做的事情的所有理由。我建议阅读它。