C# 新线程签名(静态与非静态方法)
我想我有一个简单的问题,我以前有代码:C# 新线程签名(静态与非静态方法),c#,multithreading,C#,Multithreading,我想我有一个简单的问题,我以前有代码: Thread myThread = new Thread(MainProcessingThread); myThread.IsBackground = true; isThreadRunning = true; myThread.Start(); 方法: public void MainProcessingThread() { } 你可以看到上面的方法不是静态的。这段代码过去是有效的。但我只将方法的名称(不是formInstance.MainPr
Thread myThread = new Thread(MainProcessingThread);
myThread.IsBackground = true;
isThreadRunning = true;
myThread.Start();
方法:
public void MainProcessingThread()
{
}
你可以看到上面的方法不是静态的。这段代码过去是有效的。但我只将方法的名称(不是formInstance.MainProcessingThread
)传递给上面的线程。我做错什么了吗?这是怎么回事
ps
MainProcessingThread
是主窗体的成员。我可以直接从该方法访问表单成员(实例)变量吗?鉴于MainProcessingThread
是一个实例方法,下面一行
Thread myThread = new Thread(MainProcessingThread);
是一个缩写
Thread myThread = new Thread(new ThreadStart(this.MainProcessingThread));
所以,你确实在使用这个对象。此指针作为隐式引用。要做到这一点,您应该在另一个实例方法/属性中调用它,否则您将无法访问this
引用。例如,如果您在静态方法中执行此操作,您将得到一个编译错误,因为您无法访问那里的this
关键字
另一方面,如果该方法恰好是静态的,它将被编译成
Thread myThread = new Thread(new ThreadStart(ClassName.MainProcessingThread));
.NET代理有一个与其关联的
目标
——这对应于这些代理包装的非静态方法中使用的此
引用
在本例中,您使用的是ThreadStart
委托。如果显式创建新的ThreadStart(formInstance.YourMethodName
,则可以查询其目标
属性,并查看它是否引用了formInstance
调用委托时,此目标
值(如果有)将作为第一个参数传递给基础方法-C#表示为此
引用
为了更好地理解这一点,IL(.NET的中间语言)实际上没有类似的this
.相反,C#的此
作为第一个参数传递给任何实例方法(包括属性访问器等)-这有点简化,因为您可以有不同的调用约定,但对于常见情况来说已经足够了。因此,虽然在C#中不能使用任何this
调用实例方法,但在IL中却非常简单。委托的Invoke
方法可以简单地将Target
值作为第一个参数传递,然后“模拟”C#的工作方式
至于好的实践,避免从其他线程访问GUI元素。这很容易导致意外的跨线程GUI操作并获得异常。即使保持合理的分离,实际上也很容易-数据绑定也是危险的。不,这是实例方法-好的,这意味着这是假设-这意味着我也可以从该方法直接访问实例变量?@user300455是的,您可以访问它们。但请确保您使用某种锁来同步访问。
否它将是可变变量,如Matt Johnson的回答:。但我将使用局部变量来控制线程是否仍然处于活动状态(Matt仅在计时器内使用该易失性变量)。你认为这是一个非常糟糕的主意吗?我的方法与Matt的有点不同,因为我使用该变量来检查单独的线程是否处于活动状态,而Matt只在计时器内部执行该检查。@user300455 Volatile变量不错,但如果您使用它不仅仅是一个标志,则需要小心使用它。在大多数情况下,您会感觉更好使用a来回答您的问题,我需要能够看到您的代码。您可以发布您的代码并描述您试图实现的目标吗?如果这是一个与当前问题不同的问题,我建议您改为提出一个新问题。它与Matt Johnson在此处的回答基本相同:,唯一的区别是:。我感兴趣你认为呢?