在Async方法中提示用户输入信息

时间:2013-03-05 09:53:26

标签: c# asynchronous

我正在使用这段代码,我遇到了一些关于使用async和await的问题。我之前已经创建了一个关闭“项目”的方法,并且我将它与异步Delegate异步使用,它非常有用。我还创建了一个deserializeAsync()方法,用于其他情况,也可以像宣传的那样工作。但是,我现在想为我的应用程序实现一个Open Project功能。我开始用我在其他委托中使用的Async帮助器方法编写方法,但我意识到当我需要通过文件浏览对话框提示用户输入信息时,我不知道这是否是一个好的解决方案。显示文件浏览对话框将冻结方法的执行,我认为它不再是异步的。这里的最佳做法是什么?我应该.Wait()这样的异步方法:

CloseProjectAsync().Wait();

然后让Open Project方法同步执行所有内容,或者我是否更好等待我所拥有的异步方法并使此方法“尽可能异步”?

private async Task OpenProjectAsync()
{
    //get folderPath
    if (m_OpenFileService.ShowDialog(null) != true)
       return;

    await CloseProjectAsync();

    await Task.Run(() => {
        string[] lines = File.ReadAllLines(m_OpenFileService.FileName);
    });

    await DeserializeAsync(something);
}

1 个答案:

答案 0 :(得分:1)

我会做所有事情async。模态对话有点不稳定;它们实际上在阻塞调用中执行嵌套的消息循环。这可以使您的UI和其他异步操作保持响应,但可能会导致重新入侵问题。但它比Wait更好。

如果您尝试使用Wait,则会很快遇到deadlock problem I describe on my blog