C# Async遇到的死锁(deadlock)问题
我在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);
}