Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.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,我有一个主线程(MainThread),在它上面我创建了新的thred(让我们称之为NewThread)。在NewThread中,我调用了一个方法,该方法希望为MainThread调用某个方法 问题是,当我从主线程调用NewThread.Join()时,无法完成/终止从NewThread调用方法(并且整个应用程序永远冻结…),因为主线程正在等待NewThread终止 像恶性循环之类的东西。。。有什么办法解决吗?我需要有可能从主线程终止/中止新线程,并使舒尔新线程不再存在 我希望我说得够具体 主线

我有一个主线程(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,而我使用的是以前的版本。