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

时间:2013-04-19 12:23:07

标签: c#

考虑以下方法

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

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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

  

A Thread,表示当前正在运行的主题。

我的重点

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


来自你的评论:

  

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

我不认为 是有保障的。当然,如果你有任何明显的Wait()个任务或任务的代码,那么当前的线程可以用于为Task中的一些提供服务。

也许不太明显的方式可以使用线程。


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