1

我有异步方法OnValueChange,我将静态方法称为任务,我的方法是在 Iprogress 接口的帮助下更新 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 函数,但我希望一次只运行一个任务。

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

4

1 回答 1

3

你应该避免async void。在旁注中,我在我的博客上解释说你使用的方式StartNew是危险的(你应该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();
}

至此,如何检测一个方法是否已经在运行就变得更加清楚了(因为该方法实际上返回了一个Tasknow)。一种实现是这样的:

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();
}
于 2013-10-03T23:59:34.547 回答