【发布时间】:2017-01-14 16:28:57
【问题描述】:
我看到很多关于编写代码的警告,例如...
public async void MyDangerousMethodWhichCouldCrashMyApp...
我已经读到它可以使用事件处理程序,因为它们必须返回 void。但是partial methods 也必须返回 void。可以有如下代码...
static void Main(string[] args)
{
MainAsync().Wait();
Console.ReadLine();
}
async static Task MainAsync()
{
MyCodeGeneratedClass c = new MyCodeGeneratedClass();
try
{
await c.MyCodeGeneratedMethod();
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
}
public partial class MyCodeGeneratedClass
{
public async Task MyCodeGeneratedMethod()
{
HttpClient client = new HttpClient();
Console.WriteLine(await client.GetStringAsync("http://msdn.microsoft.com"));
MyCustomCode();
}
partial void MyCustomCode();
}
然后实现为...
partial class MyCodeGeneratedClass
{
async partial void MyCustomCode()
{
HttpClient client = new HttpClient();
Console.WriteLine(await client.GetStringAsync("http://msdn.microsoft.com"));
throw new Exception("Boom");
}
}
但是如果 MyCustomCode 的实现遇到异常,应用程序会发生什么?
如果不可行,考虑到 async / await 的流行程度,这是否意味着部分方法基本上已经过时了?代码生成系统是否应该停止公开部分方法以支持事件,或者最好还是在基类中清空受保护的虚拟方法?即
protected virtual Task MyCustomCode(T foo)
{
return Task.FromResult(0);
}
编辑:好的,所以我对代码进行了几次更新。在我写的原始伪代码没有得到好评之后。我认为上面的代码表明 async partial void MyPartialMethod 肯定存在问题,因为对 MyCodeGeneratedMethod 的调用似乎确实降低了应用程序域,尽管调用周围的 try catch。我只是想知道是否有比迁移到受保护的虚拟基类方法更好的选择。
【问题讨论】:
-
恐怕你的问题很不清楚。请考虑提供更多关于您的问题和您希望达到的目标的背景信息。
-
好的...所以我已经为从未使用过代码生成、部分类或部分方法的读者详细说明了代码。
-
我不使用部分方法,并且我完全理解了原始问题(尽管原始问题中的
async partial void MyPartialMethod();无法编译,因为 async 关键字只能出现在具有主体的方法上)。 -
是的,很抱歉原来的代码是错误的......
-
我会假设该方法在异常方面的行为与任何其他异步 void 方法完全相同。至于部分方法是否过时,我无法评论,因为我不使用它们,但如果你用虚拟方法替换它们,这些方法应该是
virtual Task(即不是异步)并返回 Task.CompletedTask (如果它们必须是虚拟的,不能是抽象的)。但这只是我的一个小问题。
标签: c# asynchronous async-await