Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 新线程签名(静态与非静态方法)_C#_Multithreading - Fatal编程技术网

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在此处的回答基本相同:,唯一的区别是:。我感兴趣你认为呢?