我有此方法用于接收文件。
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) { ... }
循环中,看看是否可以减轻问题。