【问题标题】:how to run asynchronously如何异步运行
【发布时间】:2016-12-31 22:32:01
【问题描述】:

我必须并行加载两个大文件 到目前为止我有这个代码

下面的代码是点击按钮方法

private async void MILoadLogFile_Click(object sender, RoutedEventArgs e) 
{       
    ...
    if (oFD.ShowDialog() == true)
    {
        await myLogSession.LoadCompassLogAsync(oFD.FileName);
        await myLogSession.LoadCoreServiceLogAsync(oFD.FileName);
    }
}

加载方式:

public async Task LoadCompassLogAsync(String fileName)
{
    StreamReader streamReader = new StreamReader(fileName);
    if (fileName.Contains("Compass"))
    {
        ...
        try
        {
            using (streamReader)
            {
                //Console.Out.WriteLine("lineCount: " + lineCount);
                while (((line = await streamReader.ReadLineAsync()) != null)
                       && !CompassLogLoadCompleted)
                {
                    ...
                    loggingLvl = new LoggingLvl(eLoggingLvl);
                    CompassLogData cLD = new CompassLogData(id, dateTime, loggingLvl, threadId, loggingMessage);

                    await addRoCompassLogCollectionAsync(cLD);
                }
            }
        }
        catch (Exception e)
        {
            Console.WriteLine("The file could not be read:");
            Console.WriteLine(e.Message);
        }
    }
}

LoadCoreServiceLogAsyncLoadCompassLogAsync 几乎相同。

两种加载方法顺序运行。我希望它们并行运行。

【问题讨论】:

  • 这里有问题吗?

标签: c# multithreading async-await


【解决方案1】:

您的代码将一个接一个地运行任务。要并行运行这两个任务,您可以使用Task.WaitAll 方法:

var loadCompassLogTask = myLogSession.LoadCompassLogAsync(oFD.FileName);
var loadCoreServiceLogTask = myLogSession.LoadCoreServiceLogAsync(oFD.FileName);
Task.WaitAll(loadCompassLogTask, loadCoreServiceLogTask);

或者如果你想使用await,你可以使用Task.WhenAll

var loadCompassLogTask = myLogSession.LoadCompassLogAsync(oFD.FileName);
var loadCoreServiceLogTask = myLogSession.LoadCoreServiceLogAsync(oFD.FileName);
await Task.WhenAll(loadCompassLogTask, loadCoreServiceLogTask);

【讨论】:

  • +1 表示第二个选项,因为这似乎是从 UI 线程调用的。
  • @Daniel Kelley,是否可以在不使用 UI 线程的情况下使用第二个选项?
  • @pars 我的意思是你从 UI 线程调用这两个方法(你响应一个点击事件)。但是,通过使用await Task.WhenAll,您不会阻塞 UI 线程。我相信第一个选项会导致 UI 线程被阻塞。
  • @Daniel Kelley,我刚刚尝试了第二个选项,用户界面非常非常慢。有什么解决办法吗?
  • @pars 您可能应该问发布此答案的人:) 我对新异步功能的了解有限,并且我没有允许我使用它们的 VS 版本。跨度>
猜你喜欢
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 2022-12-06
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 2011-08-19
相关资源
最近更新 更多