我想创建一个具有创建文件的异步方法,并立即继续执行下载任务,该任务将创建的文件上传到云。这是此方法的外观:
public async TaskCreateAndUploadAsync()
{
await Task.Run(() =>
{
try
{
var _writeFile = new WriteFile(...);
_writeFile.DoWork();
}
catch (Exception e)
{
//Log..
}
}).ContinueWith((result) =>
{
if (!result.IsFaulted)
{
try
{
storage.UploadCreatedObject(...);
}
catch (Exception e)
{
//Log..
}
}
});
}
我的问题是:我如何在每个任务中捕获每个任务的例外方式是正确正确的,还是我应该在整个"任务..task.continuewith"中使用一个尝试键块?
使用task.continuewith?
在哪里捕获异常。
正确的答案是"不要使用ContinueWith
"。对于异步代码,您可以使用await
;对于这样的同步代码,您可以什么都不使用:
public async TaskCreateAndUploadAsync()
{
await Task.Run(async () =>
{
try
{
var _writeFile = new WriteFile(...);
_writeFile.DoWork();
storage.UploadCreatedObject(...);
}
catch (Exception e)
{
//Log..
}
});
}
然而,像这样的 Task.Run
中包裹一个方法主体是一个反图案。最好保持方法同步并具有呼叫者使用Task.Run
:
public void TaskCreateAndUpload()
{
try
{
var _writeFile = new WriteFile(...);
_writeFile.DoWork();
storage.UploadCreatedObject(...);
}
catch (Exception e)
{
//Log..
}
}
从您的方法名称中,听起来有些应该是异步的。I/O本质上是异步的。因此,如果您确实具有异步I/O(即,不使用Task.Run
用于假氨基化),那么您所产生的方法可能会如下:
public async Task TaskCreateAndUploadAsync()
{
try
{
var _writeFile = new WriteFile(...);
await _writeFile.DoWorkAsync();
await storage.UploadCreatedObjectAsync(...);
}
catch (Exception e)
{
//Log..
}
}
请注意在最后一个示例中使用await
而不是ContiueWith
。