检查具有特定方法的任务是否已在运行

时间:2013-10-03 23:20:00

标签: c# task

我有异步方法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函数,但我只希望一次运行一个任务。

检查具有特定方法的任务是否已在运行的最有效方法是什么?

1 个答案:

答案 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();
}