繁体   English   中英

我可以假设一个方法的所有执行都将在C#中的同一个线程上吗?

[英]Can I assume that all execution of a method will be on the same thread in C#?

考虑以下方法

public void DoSomething()
{
    Thread initialThread = Thread.CurrentThread;
    //Do something 
    Thread endingThread = Thread.CurrentThread;
    Debug.Assert(object.ReferenceEquals(initialThread, endingThread));
}

假设代码是编译的并且不是迭代器,断言是否总是在C#中传递?

如果你添加“而不是异步方法”,那么我认为这是一个合理的假设,是的。

基本上迭代器块和异步方法从根本上改变了执行流程 - 其他一切都是“在一个线程上从上到下执行”。 当然你的方法可能包含在别处执行的匿名函数,但我认为你不包括那些。

如果你不在网络环境中,那么除了你在中间做一些非常有趣的事情之外,这是真的。

但是,如果您处于Web环境中,那么如果操作需要一段时间,则IIS基础结构可以将执行交换到另一个线程,在这种情况下,该假设有时会是错误的。

如果您正在处理Web环境,那么我建议存储在HttpContext.Current.Items中而不是使用ThreadStatic,如果它不是Web环境,那么ThreadStatic就可以了

我认为在目前的所有实施中,是的,但我不认为它是有保障的。 CurrentThread的文档说:

一个 Thread ,表示当前正在运行的线程。

我的重点

(我也会提到异步,但鉴于我们接受该方法被宣布为void ,我决定将其排除在外)


来自你的评论:

在执行中途,该线程不会在另一种方法中使用

我不认为这有保障的。 当然,如果你在一个或多个任务上有任何明显的Wait()代码,那么当前的线程可能会用来为这些Task的一些提供服务。

可能还有一些不太明显的方法可以使用线程。


还需要注意的另一个问题是异常过滤器的存在(不能在C#中实现,但在VB中很奇怪) - 其中调用堆栈中较高的代码可能导致某些(任意)代码在抛出的异常和您的异常之间执行如果抛出异常,则catchfinally执行处理程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM