Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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# Windows窗体-如何踢出一个单独的线程并保持当前线程_C#_Multithreading - Fatal编程技术网

C# Windows窗体-如何踢出一个单独的线程并保持当前线程

C# Windows窗体-如何踢出一个单独的线程并保持当前线程,c#,multithreading,C#,Multithreading,我有一个windows应用程序和一个dll(windows窗体),我试图打开它(ActivationCheck),我试图暂停当前线程打开一个新线程(ActivationCheck),等待窗体事件返回true,然后继续主线程。 有人能解释一下我做错了什么吗?谢谢 static class Program { private static SplashScreen splash; private static bool quitApp; pr

我有一个windows应用程序和一个dll(windows窗体),我试图打开它(ActivationCheck),我试图暂停当前线程打开一个新线程(ActivationCheck),等待窗体事件返回true,然后继续主线程。 有人能解释一下我做错了什么吗?谢谢

 static class Program
    {
        private static SplashScreen splash;
        private static bool quitApp;
        private static bool activationFinished;

        [STAThread]
        static void Main()
        {

        Thread thread = new Thread(ActivationCheck);
        thread.Start();



               do
               {
                   Thread.Sleep(1000);
               } while (activationFinished);

           if (!quitApp)
           {


               Thread.Sleep(0);
              // WizardRun();
               Application.Run(new Main(ref splash));
             }
}
}

     private static void ActivationCheck()
        {

            splash.SetStatus = "Checking License...";

            Guid productId = new Guid(Properties.Settings.Default.ProductId);
            Guid versionId = new Guid(Properties.Settings.Default.VersionId);

            Client.UI.EntryPoint entryPoint = new EntryPoint();

            activationFinished = false;

            Client.BLL.ProductActivation.GenerateTrialLicense(productId1, versionId2, EditionId3);
            entryPoint.IniatePlugin(productId, versionId);
            entryPoint.PluginFinished += new EventHandlers.PluginFinishEventHandler(entryPoint_PluginFinished);


        } 
  static void entryPoint_PluginFinished(bool forceQuit)
        {
            quitApp = forceQuit;
            activationFinished = true;


        }

您可以只执行
thread.Join()
?不过,老实说,我不太确定启动第二个线程并暂停第一个线程的意义是什么;就在原来的线程上工作

代码的问题可能是
activationFinished
被保存在寄存器中;尝试将其标记为volatile,或者在访问此变量的两个位置使用
锁。更好的方法是使用
ManualResetEvent
或类似工具,并从激活代码中将其打开

using System;
using System.Threading;
static class Program
{
    static void Main()
    {
        new Thread(DoActivation).Start();
        Console.WriteLine("Main: waiting for activation");
        activation.WaitOne();
        Console.WriteLine("Main: and off we go...");
    }
    static void DoActivation(object state)
    {
        Console.WriteLine("DoActivation: activating...");
        Thread.Sleep(2000); // pretend this takes a while
        Console.WriteLine("DoActivation: activated");
        activation.Set();
        // any other stuff on this thread...
    }
    static ManualResetEvent activation = new ManualResetEvent(false);
}

就像Marc说的,你所展示的并不意味着需要第二个线程。我用于我的应用程序的插件逻辑作为主线程的一部分出现在我的MainForm的
Load
事件处理程序中。有人曾经告诉我,除非你真的需要,否则你永远不应该生成新线程,在这种情况下,你希望激活检查是一个阻塞调用,线程的设计目的是不阻止调用方,因此生成新线程并不是您想要做的事情,