![](/img/trans.png)
[英]Can I write a C# method that will terminate execution of anyone who calls it (within the same class)?
[英]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中很奇怪) - 其中调用堆栈中较高的代码可能导致某些(任意)代码在抛出的异常和您的异常之间执行如果抛出异常,则catch
或finally
执行处理程序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.