我需要一个简单的布尔值来通知长时间运行的进程中止,因为它是循环的一部分,如下所示:

bool Abort = false;
void MyLongRunningMethod()
{
while(true)
{
    // loop code goes here, takes 2 hours ish to run
    if(Abort)
       break;
}
}

我知道如何正确编写此代码,但是我想知道,如果我原样保留它,会有任何风险吗? 还是唯一的风险(对于我而言,这不是问题),循环可能会运行额外的时间(在编写bool的同时读取bool)。

我是否会遗漏任何怪异的边缘情况,或者如果我对以下语句感到满意,那么这是否真的可以解决:“当中止为真时,该方法应该中断,但可能在没有副作用的情况下再运行一段时间”? 还是我错过了可以完全打破世界的东西?

===============>>#1 票数:5

首先,此处的bool应标记为volatile以创建内存屏障/防止某些缓存给您带来假阴性。 其次, CancellationTokenSource是一个很好的选择:

private readonly CancellationTokenSource _cancel = new CancellationTokenSource();

void MyLongRunningMethod()
{
    while (!_cancel.IsCancellationRequested)
    {
        // loop code goes here, takes 2 hours ish to run
    }
}

然后停止循环:

_cancel.Cancel();

如果希望保留其最初的编写方式,请执行while (!Abort)代替while (true)

  ask by Ronan Thibaudau translate from so

未解决问题?本站智能推荐:

2回复

在线程之间共享秒表

我需要对连接到服务器的每个用户执行ping操作,并计算响应所需的时间。 如何从另一个线程发送数据后立即启动秒表,并在主线程接收数据时停止秒表?
2回复

在线程之间共享数据

我正在尝试实现一种应使用线程或任务并行运行的算法。 困难在于我希望线程/任务不时与所有其他线程共享其最佳结果。 基本思想是这样的: 如何使用System.Threading或System.Threading.Tasks来实现这一目标,并且确实不应该将任务用于长时间运行的操作吗?
1回复

C#:在线程之间共享类成员

我一直在开发多线程算法,并且对在C#中的线程之间共享类成员有一些疑问。 假设我们有两个类,算法和处理器。 处理器具有主要方法DoWork和附加的AvaliableResources方法,有时会调用该方法来更改可用于处理的可用资源的数量。 Algorithm对象中的Run和UpdateR
3回复

在线程之间共享事务范围

我有一堂课做一些交易代码。 假设: 现在我有一些执行此代码的线程: 每个线程都在创建自己的事务。 我如何在所有线程之间共享同一事务?
3回复

在线程之间共享字典中的数据

假设代码: 这是安全的,但是问题在于它不是很有效。 一些想法如何使用.NET 2.0兼容代码更好地做到这一点? (在最佳情况下,只有等待相同键的相同结果的线程才应等待)
2回复

为什么ThreadStatic数据在线程之间意外共享?

我有一个我编写的日志框架,它能够跟踪“日志记录上下文”。 它有一个可插拔的策略框架,但我最常使用的是ThreadStatic变种,它跟踪[ThreadStatic]变量中的上下文。 我一直在尝试解决多线程工作流中的日志记录上下文问题。 目标是让所有共享公共线程的方法和类的所有调用的所有日志
2回复

在线程之间同步VBO的最佳方法

所以我有一个像Minecraft一样的块系统,这意味着它是一个渲染数据块。 当玩家四处移动并进入另一个块时,在加载新的块时正在卸载超出范围的块,这使得它非常苛刻,因为渲染数据必须先在另一个线程中计算才能显示。 假设数据已经从磁盘加载,它看起来像这样 主/渲染线程渲染数据生成线程
2回复

在线程之间切换

我有两个线程: 我希望线程1做一些工作(但不完成),然后让线程2做一些工作(但不完成),然后返回以完成线程1,然后返回并完成线程2。 到目前为止,我有: 这是行不通的,也不知道从这里去哪里。
2回复

在线程之间传递数据

我有以下代码,其中我试图处理大量数据并更新UI。 我已经使用后台工作者尝试了同样的事情,但是遇到了类似的问题。 问题似乎是我正在尝试使用未在新线程上实例化的类(实际错误是当前线程不“拥有”实例)。 我的问题是,有没有一种方法可以在线程之间传递该实例以避免该错误? 编辑: Da
2回复

是否存在在线程之间快速交换数据的安全方法?

我正在设置一个应用程序,该应用程序从称重传感器读取数据,并基于读取的数据实时中断电动机的推力。 从称重传感器获得高频读数至关重要。 我使用C#进行编程,因此决定使用单独的线程从称重传感器获取数据。 我的问题是:如何以线程安全的方式使用线程中获取的数据? 例如在图表中显示它们。