我对此很陌生。周围的信息很多,我有点困惑。我想确认我的理解是否正确并感谢任何帮助。我将在 (i) 中对每个问题进行编号,以便更容易回答。
我有一个带有 ExecuteAsync(CancellationToken CancellationToken) 和 StopAsync(CancellationToken CancellationToken) 的BackgroundService。
我假设这两种方法在服务运行时都会获得相同的令牌。(1) 这是真的吗?
如果我理解正确,只要取消标记未标记为取消,我就应该使用 ExecuteAsync 中的取消标记来执行某些操作。ExecuteAsync 有一个 while 循环,在取消令牌未取消时运行迭代。每次迭代都会等待某些事情发生,并可能启动一些异步任务。
当我启动这些任务时,我应该从链接到cancellationToken的新CancellationTokenSource给它们一个CancellationToken,以便(A)任务知道何时应该取消服务以及何时应该取消任务本身(但是,在后一种情况,无需取消服务本身);(B) 使cancellationToken用完。(2) (A)和(B)正确吗?
简单地在某些 CancellationTokenSource 上调用 Cancel() 实际上并不会自动取消我的任务或引发异常。这个逻辑由我来定义。(3)这是真的吗?
这让我想到了另一个问题。假设我发现内部某个任务确实被标记为取消。什么是正确/预期的行为?我应该清理任务的资源,然后对我拥有的令牌使用 ThrowIfCancellationRequested() 吗?(4)这是真的吗?
最后,当服务本身被取消时,即当 ExecuteAsync 的主循环发现其令牌被取消时,我应该如何表现。(5) 我应该立即 ThrowIfCancellationRequested 吗?我应该先清理资源,然后再 ThrowIfCancellationRequested 吗?或者我应该只调用 ThrowIfCancellationRequested 作为 StopAsync 的最后一行?
c# service background-service cancellationtokensource cancellation-token
我有一个LinkedList的n随机Integer升序秒.
如果我Collections.binarySearch在该列表上使用它,它适用于任何n我尝试过的.
当我换行LinkedList与AbstractList然而,对于n>10000二进制搜索开始表现得非常奇怪.
它不是运行适当的二进制搜索,而是遍历整个列表.
我有一个"file"包含升序的随机数,其中每行包含一个数字.
我想二进制搜索"file"并找到"line number"给定数字的索引(或).
一个简单的解决方案就是读取整个文件并将每个数字放入a中LinkedList,然后使用Collections.binarySearch它LinkedList.
现在,让我们说我得到的信息是,从中读取一行"file"是一项代价高昂的操作.
我试图做的,尽量减少我必须阅读的时间"file",是"模拟"那个LinkedList,并AbstractList在每次使用时使用一个地方get(int index),AbstractList我只是index从中读取行"file".
当我的AbstractList大小是<1000,当我尝试更大的列表时,二进制搜索似乎停止工作,并且只是迭代所有AbstractList(从第一个节点到最后一个节点),这似乎工作得很好.
我似乎已经将问题缩小到使用带有二进制搜索的大型AbstractList.我不确定为什么会这样,并且会喜欢一些帮助.
我已经包含了"长版",以防有人能够提出另一种解决方案.
谢谢!