如果正在运行则取消异步任务

dav*_*vid 4 c# task cancellation

我有几种方法调用以下方法(例如文本框的onkeyup),它异步过滤列表框中的项目.

private async void filterCats(string category,bool deselect)
{

    List<Category> tempList = new List<Category>();
    //Wait for categories
    var tokenSource = new CancellationTokenSource();
    var token = tokenSource.Token;

    //HERE,CANCEL TASK IF ALREADY RUNNING


    tempList= await _filterCats(category,token);
    //Show results
    CAT_lb_Cats.DataSource = tempList;
    CAT_lb_Cats.DisplayMember = "strCategory";
    CAT_lb_Cats.ValueMember = "idCategory";

}
Run Code Online (Sandbox Code Playgroud)

以及以下任务

private async Task<List<Category>> _filterCats(string category,CancellationToken token)
{
    List<Category> result = await Task.Run(() =>
    {
        return getCatsByStr(category);
    },token);

    return result;
}
Run Code Online (Sandbox Code Playgroud)

我想测试任务是否已经运行,如果是,取消它并使用新值启动它.我知道如何取消任务,但是如何检查它是否已经在运行?

Phi*_*yck 5

这是我用来执行此操作的代码:

if (_tokenSource != null)
{
    _tokenSource.Cancel();
}

_tokenSource = new CancellationTokenSource();

try
{
    await loadPrestatieAsync(_bedrijfid, _projectid, _medewerkerid, _prestatieid, _startDate, _endDate, _tokenSource.Token);
}
catch (OperationCanceledException ex)
{
}
Run Code Online (Sandbox Code Playgroud)

对于程序调用它是这样的(当然简化):

private async Task loadPrestatieAsync(int bedrijfId, int projectid, int medewerkerid, int prestatieid,
        DateTime? startDate, DateTime? endDate, CancellationToken token)
{
    await Task.Delay(100, token).ConfigureAwait(true);
    try{
        //do stuff

        token.ThrowIfCancellationRequested();

    }
    catch (OperationCanceledException ex)
    {
       throw;
    }
    catch (Exception Ex)
    {
        throw;
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在做100毫秒的延迟,因为相同的动作被相当快速和重复地触发,100毫秒的小推迟使得它看起来实际上更具响应性.