C#线程问题
我有一个主线程(MainThread),在它上面我创建了新的thred(让我们称之为NewThread)。在NewThread中,我调用了一个方法,该方法希望为MainThread调用某个方法 问题是,当我从主线程调用NewThread.Join()时,无法完成/终止从NewThread调用方法(并且整个应用程序永远冻结…),因为主线程正在等待NewThread终止 像恶性循环之类的东西。。。有什么办法解决吗?我需要有可能从主线程终止/中止新线程,并使舒尔新线程不再存在 我希望我说得够具体 主线程:C#线程问题,c#,multithreading,C#,Multithreading,我有一个主线程(MainThread),在它上面我创建了新的thred(让我们称之为NewThread)。在NewThread中,我调用了一个方法,该方法希望为MainThread调用某个方法 问题是,当我从主线程调用NewThread.Join()时,无法完成/终止从NewThread调用方法(并且整个应用程序永远冻结…),因为主线程正在等待NewThread终止 像恶性循环之类的东西。。。有什么办法解决吗?我需要有可能从主线程终止/中止新线程,并使舒尔新线程不再存在 我希望我说得够具体 主线
void method()
{
if(currentthread!=null)
{
currentthread.Join();
currentthread=null;
}
sth...
Backgroundworker worker = new Backgroundworker();
worker.DoWork += delegate (...)
{
currentthread=Thread.CurrentThread;
Func();
}
....
}
新线程:
delegate void FuncDel();
void Func()
{
if(MainThread.InvokeRequired)
{
FuncDel funcD = new FuncDel();
MainThread.InvokeRequired(funcD);
return;
}
....
}
好的,显而易见的答案是,如果工作线程有可能尝试在主线程上调用()某些内容,那么主线程永远不应该加入()工作线程 如果只使用Join()等待主线程上的关闭,则应首先执行thread.Abort()之类的操作,或者更好地使用Mutex或共享变量之类的线程同步对象,以指示工作线程需要中止。一旦您通知工作线程中止,然后允许您的主线程加入()它;在尝试调用主线程上的方法之前,工作线程应该始终检查是否已中止
如果出于其他原因使用Join(),则应再次查看线程同步对象,如互斥对象。这使线程可以等待彼此发送信号——工作线程可以在需要调用()之前“唤醒”主线程,以确保主线程有足够的CPU时间来完成其工作。这就是线程所做的。Join会阻止调用线程,直到连接的线程终止。我想我不知道如果您只是想在另一个线程上调用,为什么要使用join。如前所述,守则将有助于澄清情况
如果您的实现不允许您阻止主线程,您可以轮询ThreadState以检查线程的状态,而不是使用联接。听起来您几乎想要取消模式。尝试此TPL选项:
CancellationTokenSource cts = new CancellationTokenSource();
Task.Factory.StartNew(() =>
{
if(cts.Token.IsCancellationRequested)
return;
// Do Stuff
});
基本上,您可以为想要执行的操作启动一个任务,如果需要取消它,您只需调用
cts.Cancel();
你的例子很复杂;让一个线程分离以调用某个方法与原始线程无关 你会发布你的代码吗?你用什么技术在主线程上调用你的方法?这是某种控制。调用还是类似的?+1:尽管我倾向于在这种情况下使用
EventWaitHandle
,而不是Mutex
。不幸的是,TPL使用的是.net 4.0,而我使用的是以前的版本。