Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.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,不确定我的标题是否写得好,但不管怎样:) 我有两个线程:带有需要完成的工作的主线程和包含带有进度条和取消按钮的窗体的工作线程。在普通代码中,情况正好相反,但在这种情况下我不能这样做 当用户单击“取消”按钮时,将显示一条提示,询问他是否确实要取消工作。问题是工作在主线程上继续。我可以让主线程停止工作等,但我希望它停止工作时,他点击“是”的提示 例如: // Main thread work starts here t1 = new Thread(new ThreadStart(pr

不确定我的标题是否写得好,但不管怎样:)

我有两个线程:带有需要完成的工作的主线程和包含带有进度条和取消按钮的窗体的工作线程。在普通代码中,情况正好相反,但在这种情况下我不能这样做

当用户单击“取消”按钮时,将显示一条提示,询问他是否确实要取消工作。问题是工作在主线程上继续。我可以让主线程停止工作等,但我希望它停止工作时,他点击“是”的提示

例如:

// Main thread work starts here    
    t1 = new Thread(new ThreadStart(progressForm_Start));
    t1.Start();

    // Working
    for (i = 0; i <= 10000; i++)
    {
        semaphore.WaitOne();
        if (pBar.Running)
            bgworker_ProgressChanged(i);
        semaphore.Release();
        if (pBar.IsCancelled) break; 
    }

    t1.Abort(); 
// Main thread work ends here

// Start progress bar form in another thread
void progressForm_Start()
{
    pBar.Status("Starting");
    pBar.ShowDialog();
}
//主线程工作从这里开始
t1=新线程(新线程开始(progressForm_Start));
t1.Start();
//工作
对于(i=0;i我建议使用,它可以处理这种复杂的场景。它是任务并行库的一部分,但实际上不必与
Task
对象一起使用;它可以很容易地与旧式
Thread
对象一起使用

当然,如果您有时间,我建议将主线程的工作定义为
任务
对象(使用
TaskScheduler.FromCurrentSynchronizationContext
在主UI线程上运行)


请注意,上面的所有内容都假定为.NET 4.0。如果您仍然停留在旧平台上,您只需取消一个
bool;
字段,该字段由
锁或类似的东西保护。提示:不要调用
线程。中止
;这是邪恶的。

我有几个简短的评论:

  • 避免使用
    Thread.Abort()
  • 将你的线程设置为后台线程:
    thread.IsBackground=true
    (当你的应用程序退出时,这将自动退出线程)
  • 下面详细讨论了如何安全地阻止线程运行:

    要停止主线程上的工作,必须执行以下操作:

    boolean volatile isRunning = true;
    
    static void Main(...)
    {
        // ...
        // Working
        for (i = 0; i <= 10000; i++)
        {
            semaphore.WaitOne();
            if (!isRunning) break; // exit if not running
            if (pBar.Running)
                bgworker_ProgressChanged(i);
            semaphore.Release();
        }
        //...
        t1.Interrupt();// make the worker thread catch the exception
    }
    // 
    void cancelButton_Click(object sender, EventArgs e)
    {
        isRunning = false; // optimistic stop
        semaphore.Release();
    }
    
    boolean volatile isRunning=true;
    静态空心主管道(…)
    {
    // ...
    //工作
    
    对于(i=0;i)为什么不能将表单放在主线程中,然后简单地使用Swing WorkerThread?这看起来很复杂。“普通代码”和“普通代码”是什么意思我的意思是我一开始会怎么想。我不能把表单放在主线程中,因为我需要能够在任何时候点击取消按钮来取消操作。但是我不能使用BackgroundWorker,因为我不想在这里使用异步线程。主线程已经是一个显示数据和做一些事情的表单在后台。我需要一个进度条和顶部的取消按钮,在主窗体上执行此操作几乎是不可能的。不幸的是,我们被困在.NET 3.5上,因为这正是我需要的:(…无论如何,谢谢!好的,谢谢。我有机会的时候会试试这个。很抱歉,我没有回复你…我们决定尝试不同的路线,但谢谢你的回答。它至少为我们指明了正确的方向:)@Duracell,我很高兴我的回答在某些方面有所帮助:)。