- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我认为 RunAsync
方法采用 CancellationToken
作为参数,这很棒。 不幸的是,根据我的观察,我从未被取消。
当然,取消RunAsync 方法并调用OnCloseAsync 会有点多余。 我仍然想知道什么时候(如果)取消真的发生了。
我是否应该编写一些额外的代码来在我的客户端中提供一个有效的 Stop() 方法?我更希望 RunAsync 中的 cancellationToken 实际上被取消 ;-)
我的服务架构服务代码:
/// <summary>
/// This is the main entry point for your service instance.
/// </summary>
/// <param name="cancellationToken">Canceled when Service Fabric needs to shut down this service instance.</param>
protected override async Task RunAsync(CancellationToken cancellationToken)
{
// TODO: Replace the following sample code with your own logic
// or remove this RunAsync override if it's not needed in your service.
long iterations = 0;
while (!cancellationToken.IsCancellationRequested)
{
// I commented this out because I want my client to handle the cancellation
// event gracefully without throwing an OperationCanceled exception.
//cancellationToken.ThrowIfCancellationRequested();
// I never found these messages in any logs. Nor in the diagnostics events window in Visual Studio.
ServiceEventSource.Current.ServiceMessage(this, "Working-{0}", ++iterations);
await _client.Start(cancellationToken);
await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
}
}
我的示例客户端实现:
public class Client
{
private static readonly Logger _logger = LogManager.GetCurrentClassLogger();
public async Task Start(CancellationToken cancellationToken = default(CancellationToken))
{
while (!cancellationToken.IsCancellationRequested)
{
_logger.Info("Saying hello from Main Operation.");
await Task.Delay(3000, cancellationToken);
}
_logger.Info("Cancellation requested. Shutting down MainOperation().");
}
public void Stop()
{
_logger.Info("Stop requested. But I have no means to stop. Not implemented.");
}
}
最佳答案
是的,取消 token 实际上被取消了。这是有保证的。我可以向您保证,经过多年的测试和生产使用,这不是疏忽。
但是您的代码中存在疏忽。
如果您希望从您的客户端看到此跟踪输出:
_logger.Info("Cancellation requested. Shutting down MainOperation().");
你不会,而是极不可能你永远不会看到它。为什么?因为它之前的这一行:
await Task.Delay(3000, cancellationToken);
在延迟期间发出取消 token 信号时,将抛出 OperationCanceledException。这会将您踢出循环并退出 RunAsync,因此您的日志行将不会执行。
由于您在该延迟中花费了 3 秒,而在循环之外花费了纳秒,您可以理解为什么当您不在延迟内时取消发生的可能性极小。
关于c# - Service Fabric RunAsync(CancellationToken cancellationToken) 没有被取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39609918/
我第一次用 GWT.RunAsync 拆分了我的模块以更快地加载。但是一旦加载,我想加载所有其他代码拆分,因为用户将空闲一段时间,并且在需要时他可以更快地处理这些部分。 有人尝试过这样做吗?有什么简单
我正在构建一个将运行 BackgroundService 的 .NET Core 3.1 应用程序在 Docker 容器中。虽然我已经为 BackgroundService 实现了启动和关闭任务,并且
我有一个具有invoke方法的函数,该函数在内部调用soap API, 而且执行过程大约需要22秒,代码中几乎没有其他方法, 因此,完全deleteSoemthing()(下面的代码)方法大约需要24
我正在尝试使用 CompletableFuture 在 JavaFX Canvas 上写入大量像素,尽管没有抛出异常,但我的方法似乎并未完成其任务。 我是异步编程的新手,不确定应该从哪里开始,但我认为
上下文:我已阅读 this SO 线程讨论 CompletableFuture 和 Thread 之间的差异。 但我试图了解何时应该使用 new Thread() 而不是 runAsync()。 我知
早上好, 我还没有完全掌握 CompletableFutures 的窍门(我是一位经验丰富的开发人员,但我并不觉得它们特别直观!)。 给出以下代码片段: public CompletionStage
我正在尝试在初始化不同子系统时使用 runAsync 来修改应用程序的加载性能,但我有几个问题: 当callback的onSuccess方法中调用的代码被拆分到另一个下载片段中时,被调用的类、子类、方
我写了下面的代码 ExecutorService service = Executors.newFixedThreadPool(3); Runnable task = () -> { System.o
如何停止 RunAsync? CancellatioTokenSource cts = new CancellationTokenSource(); //I thought that it's mus
我在网上搜索过关于ThreadHelper.JoinableTaskFactory.RunAsync的信息很少 如果我有以下代码,Test1 在 MainThread 上运行: public bool
我的代码运行良好: String name = "Oscar"; CompletableFuture.runAsync(() -> doX(name)); 现在我需要向 name 变量添加一些逻辑:
先决条件(一般描述): 1.静态类字段 static List ids = new ArrayList<>(); 2. CompletableFuture#runAsync(Runnable runn
我刚刚读了the documentation关于 CompletableFuture::runAsync 并且被解释弄糊涂了。这是那里写的: Returns a new CompletableFutu
我是 C# 的新手,目前正在做一个需要 BackgroundWorkers 的项目.我发现 BackgroundWorker RunWorkerAsync只需将一个对象作为参数。但在某些情况下,我需要
我有一组在 SQLite 异步方法中运行的 INSERT 语句: SQLite3JS.openAsync(path).then(function (db) { $.each(sql, func
我尝试使用 Kotlin 和 TornadoFX 库中的套接字连接来实现聊天应用程序以制作 GUI。 当我尝试启动客户端时出现问题,因为它一直在等待来自服务器的消息,尽管我将更新标签并接收消息的代码放
我的要求是每 30 秒轮询一次 MongoDB,以了解集合中的任何数据更改。我已使用 Java CompletableFuture.runAsync 来实现此功能,如下面捕获的代码所示。我已经测试运行
我正在使用 Dispatcher.RunAsync() 从后台线程显示 MessageDialog。但我无法弄清楚如何返回结果。 我的代码: bool response = f
假设我有这个示例代码,并且在 runAsync 中遇到异常。我的问题是这个异常是否会阻止 thenRun 被执行,因为 thenRun 与此代码的调用者方法在同一线程中运行。 private void
在等待 Dispatcher.RunAsync 时,继续会在工作安排时发生,而不是在工作完成时发生。我如何等待工作完成? 编辑 我最初的问题假设过早继续是由 API 的设计引起的,所以这是真正的问题。
我是一名优秀的程序员,十分优秀!