1

考虑以下方法

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

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

4

3 回答 3

4

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

基本上迭代器块和异步方法从根本上改变了执行流程——其他一切都是“在一个线程上从上到下执行”。当然,您的方法可以包含在其他地方执行的匿名函数,但我假设您不包括在内。

于 2013-04-19T12:25:00.243 回答
0

如果您不在网络环境中,那么除了您在两者之间做一些非常有趣的事情之外,那将是正确的。

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

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

于 2013-04-19T12:26:30.607 回答
0

我认为在所有当前的实现中,是的,但我认为不能保证。的文档CurrentThread说:

A Thread表示当前正在运行的线程。

我的重点

(我也打算提到 async ,但鉴于我们接受该方法被声明为void,我决定排除这种情况)


从您的评论中:

该线程不会在执行中途用于其他方法

我不认为这有保证的。当然,如果您Wait()在一个或多个任务上有任何明显的代码,则当前线程可能用于为其中的一些提供服务Task

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


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

于 2013-04-19T12:26:33.997 回答