C# - 通过网络流接收文件正在阻止WPF UI



我有此方法用于接收文件。

public Task Download(IProgress<int> downloadProgress)
{
    return Task.Run
    (
        async () =>
        {
            var counter = 0;
            var buffer = new byte[1024];
            while (true)
            {
                var byteCount = await _networkStream.ReadAsync(buffer, 0, buffer.Length);
                counter += byteCount;
                downloadProgress.Report(counter);
                if (byteCount != buffer.Length)
                    break;
            }
        }
    );
}

然后在UI中这样称呼:

await Download(progress);

进度只是更新标签。

运行时,UI将被阻止(但是一段时间后,它将正确更新标签)。我不明白为什么,不应该task.run()创建一个新线程吗?

我该如何解决?

您在无限循环上调用downloadProgress.Report,而执行中没有任何停顿。我有根据的猜测是,这意味着每次执行时间都在UI线程上可用时,非UI线程正在请求操作,该操作需要UI线程的时间(按同步上下文的要求),因此用Invications堵塞了它。<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

本质上,您可以用一个不终止的小流来阻止它。

尝试将Thread.Sleep(10)放入您的" Spinlock" while(true) { ... }循环中,看看是否可以减轻问题。

最新更新