相关疑难解决方法(0)

并行执行任务

好吧,基本上我有一堆任务(10),我想同时启动它们并等待它们完成.完成后我想执行其他任务.我读了很多关于这方面的资源,但我无法理解我的具体案例......

这是我目前拥有的(代码已经简化):

public async Task RunTasks()
{
    var tasks = new List<Task>
    {
        new Task(async () => await DoWork()),
        //and so on with the other 9 similar tasks
    }


    Parallel.ForEach(tasks, task =>
    {
        task.Start();
    });

    Task.WhenAll(tasks).ContinueWith(done =>
    {
        //Run the other tasks
    });
}

//This function perform some I/O operations
public async Task DoWork()
{
    var results = await GetDataFromDatabaseAsync();
    foreach (var result in results)
    {
        await ReadFromNetwork(result.Url);
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,当我等待任务完成时WhenAll,它告诉我所有任务都已结束,即使它们都没有完成.我尝试添加Console.WriteLine我的内容foreach,当我进入延续任务时,数据不断从我以前的Tasks中进入,并没有真正完成.

我在这做错了什么?

.net c# asynchronous task-parallel-library async-await

28
推荐指数
3
解决办法
5万
查看次数

为什么 File.ReadAllLinesAsync() 会阻塞 UI 线程?

这是我的代码。读取文件行的​​ WPF 按钮的事件处理程序:

private async void Button_OnClick(object sender, RoutedEventArgs e)
{
    Button.Content = "Loading...";
    var lines = await File.ReadAllLinesAsync(@"D:\temp.txt"); //Why blocking UI Thread???
    Button.Content = "Show"; //Reset Button text
}
Run Code Online (Sandbox Code Playgroud)

File.ReadAllLines()在 .NET Core 3.1 WPF App 中使用了异步版本的方法。

但它阻塞了 UI 线程!为什么?


更新:与@Theodor Zoulias 相同,我做了一个测试:

private async void Button_OnClick(object sender, RoutedEventArgs e)
    {
        Button.Content = "Loading...";
        TextBox.Text = "";

        var stopwatch = Stopwatch.StartNew();
        var task = File.ReadAllLinesAsync(@"D:\temp.txt"); //Problem
        var duration1 = stopwatch.ElapsedMilliseconds;
        var isCompleted = task.IsCompleted;
        stopwatch.Restart();
        var lines …
Run Code Online (Sandbox Code Playgroud)

c# wpf asynchronous async-await .net-core-3.1

4
推荐指数
1
解决办法
620
查看次数