我有异步方法OnValueChange
,其中我将静态方法称为任务,我的方法是在Iprogress intereface的帮助下更新gui,我的方法返回Image:
public async void OnValueChange(object sender, EventArgs e)
{
var progress = new Progress<int>(i => ProgresBar.Value = i);
Image im = await Task.Factory.StartNew(() => MyStaticClass.MyStaticFunction(progress),
TaskCreationOptions.LongRunning);
Picture = im;
}
在某些情况下,我会在短时间内频繁调用OnValueChange函数,但我只希望一次运行一个任务。
检查具有特定方法的任务是否已在运行的最有效方法是什么?
答案 0 :(得分:4)
你应该避免async void
。在旁注中,我在我的博客上解释了the way you're using StartNew
is dangerous(您应该使用Task.Run
代替。)
将这两个指南应用于您的示例,代码如下所示:
public async Task OnValueChangeAsync()
{
var progress = new Progress<int>(i => ProgresBar.Value = i);
Image im = await Task.Run(() => MyStaticClass.MyStaticFunction(progress));
Picture = im;
}
public async void OnValueChange(object sender, EventArgs e)
{
await OnValueChangeAsync();
}
此时,如何检测方法是否已在运行变得更加清晰(因为该方法实际上现在返回Task
)。一个实现是这样的:
private async Task OnValueChangeImplAsync()
{
var progress = new Progress<int>(i => ProgresBar.Value = i);
Image im = await Task.Run(() => MyStaticClass.MyStaticFunction(progress));
Picture = im;
_onValueChangeTask = null;
}
private Task _onValueChangeTask;
public Task OnValueChangeAsync()
{
if (_onValueChangeTask != null)
return _onValueChangeTask;
_onValueChangeTask = OnValueChangeImplAsync();
return _onValueChangeTask;
}
public async void OnValueChange(object sender, EventArgs e)
{
await OnValueChangeAsync();
}