考虑以下方法
public void DoSomething()
{
Thread initialThread = Thread.CurrentThread;
//Do something
Thread endingThread = Thread.CurrentThread;
Debug.Assert(object.ReferenceEquals(initialThread, endingThread));
}
假设代码是编译的并且不是迭代器,断言是否总是在C#中传递?
答案 0 :(得分:4)
如果您添加“而不是异步方法”,那么我认为这是一个合理的假设,是的。
基本上迭代器块和异步方法从根本上改变了执行流程 - 其他一切都是“在一个线程上从上到下执行”。当然你的方法可能包含在别处执行的匿名函数,但我认为你不包括那些。
答案 1 :(得分:0)
如果你不在网络环境中,那么除了你在中间做一些非常有趣的事情之外,这是真的。
如果您处于Web环境中,那么如果操作需要一段时间,IIS基础结构可以将执行交换到另一个线程,在这种情况下,该假设有时会是错误的。
如果您正在处理Web环境,那么我建议存储在HttpContext.Current.Items中而不是使用ThreadStatic,如果它不是Web环境,那么ThreadStatic就可以了
答案 2 :(得分:0)
我认为在目前的所有实施中,是的,但我不认为它是有保障的。 CurrentThread
的文档说:
A
Thread
,表示当前正在运行的主题。
我的重点
(我也会提到异步,但鉴于我们接受该方法被声明为void
,我决定将其排除在外)
来自你的评论:
线程不会在执行中途的另一种方法中使用
我不认为 是有保障的。当然,如果你有任何明显的Wait()
个任务或任务的代码,那么当前的线程可以用于为Task
中的一些提供服务。
也许不太明显的方式可以使用线程。
需要注意的另一个项目是异常过滤器的存在(不能在C#中实现,但在VB中很奇怪) - 其中调用堆栈中较高的代码可能导致某些(任意)代码在异常之间执行如果抛出异常,则抛出并执行catch
或finally
个处理程序。