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

本文关键字:任务 是否 运行 方法 检查 | 更新日期: 2023-09-27 18:33:45

我有异步方法OnValueChange,我将静态方法称为任务,我的方法在Iprogress界面的帮助下更新了gui,并且我的方法返回了图像:

  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 函数,但我只想一次运行一个任务。

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

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

你应该避免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();
}

此时,如何检测方法是否已运行变得更加清晰(因为该方法现在实际上返回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();
}