C# Async遇到的死锁(deadlock)问题

weixin_38061090 2016-11-16 04:36:07
我在Winform的demo中学习使用Async时候遇到的死锁问题!
简述:
通过IProgress更新进度条,都是Async的方法,Task.WhenAll或者await一个进度条的task到达100%,开始第二个进度条更新
代码如下,共两个cs
第一个cs:
class ProgressHelper
{
public int PercentCompleted = 0;
public int MaxValue = 100;

private IProgress<int> m_progress = new Progress<int>();

public IProgress<int> Progress
{
get { return m_progress = new Progress<int>(); }
set { m_progress = value; }
}


public async Task<string> ProgressReportAsync(int scaleValue, string returnResult)
{
PercentCompleted = 0;

while (PercentCompleted <= MaxValue)
{
if (m_progress != null)
{
await Task.Delay(TimeSpan.FromMilliseconds(50));

if (PercentCompleted + scaleValue <= 100)
{
PercentCompleted += scaleValue;
}
else
{
PercentCompleted += 100 - PercentCompleted;
}

m_progress.Report(PercentCompleted);
}
}
return returnResult;
}
}
第二个cs:
private async void StartRunButton_Click(object sender, EventArgs e)
{
RunProgressBar().ConfigureAwait(false);
}

private async Task RunProgressBar()
{
Task<string> task = RunProgressBar(m_firstProgressBar,
m_firstProgressValueLabel, 7,
"Process One Done!");

task.ConfigureAwait(false);
await Task.WhenAll(task); //无法运行到下面
RunProgressBar(m_lastProgressBar, null, 7, "Process Last Done!");

}

private async Task<string> RunProgressBar(ProgressBar progressBar, Label progressBarValueLable, int scaleValue, string returnResult)
{
if (progressBar.Value != 0)
{
progressBar.Value = 0;
}

ProgressHelper progressHelper = new ProgressHelper();
(progressHelper.Progress as Progress<int>).ProgressChanged += (sender, e) =>
{
if (progressHelper.PercentCompleted <= progressHelper.MaxValue)
{
if (progressBarValueLable != null)
{
progressBarValueLable.Text = string.Format("{0}%", progressHelper.PercentCompleted);
}
if (progressBar != null)
{
progressBar.Value = progressHelper.PercentCompleted;
}
}
};
return await progressHelper.ProgressReportAsync(scaleValue, returnResult);
}




...全文
22 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复

476

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧