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)
我想测试任务是否已经运行,如果是,取消它并使用新值启动它.我知道如何取消任务,但是如何检查它是否已经在运行?
这是我用来执行此操作的代码:
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毫秒的小推迟使得它看起来实际上更具响应性.