我正在尝试异步 CTP,4.5 版允许使用异步方法而无需编写 Begin/End 方法。
我的第一个探测是执行一个返回 void 的异步方法。我看到了一些示例并执行以下操作:
private void btnAsync01_Click(object sender, RoutedEventArgs e)
{
UpdateTxtLog("click button: " + System.DateTime.Now);
method01Async();
UpdateTxtLog("after ethod01Async: " + System.DateTime.Now);
}
private async void method01Async()
{
await TaskEx.Run(() =>
{
UpdateTxtLog("Enter method01Async: " + System.DateTime.Now);
Thread.Sleep(10000);
UpdateTxtLog("exit method01Async: " + System.DateTime.Now);
});
}
在我的 WPF 项目中,我有一个用于查看结果的文本框和一个执行异步方法的按钮。
在异步方法中,我使用了等待,因为该方法是异步的,所以需要使用 TasEx.Run 来创建一个执行代码的新线程。
我的疑问就在这一点上。在我看到的几个关于如何创建返回 void 的异步方法的示例中,使用这种方式,Task.Run 或 TaskEx.Run。
如果我没记错的话,Task.Run 创建一个新线程来执行该方法。那为什么要使用异步方法,如果用Task,创建一个新线程,我得到我想要的,而不是阻塞主线程?
另外,如果异步方法访问一些共享变量,我必须小心并发,对吧?所以我不知道使用异步方法的好处,至少在这种情况下。
事实上,我在没有 async 和 await 的情况下使用相同的代码,结果是一样的,主程序没有阻塞,一切都按我的预期工作。方法是这样的:
private void method01Async()
{
TaskEx.Run(() =>
{
UpdateTxtLog("Enter method01Async: " + System.DateTime.Now);
Thread.Sleep(10000);
UpdateTxtLog("Exit method01Async: " + System.DateTime.Now);
});
}
我的问题是,当方法返回 void 时,这是使用异步的正确方法吗?