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#应用程序中终止线程?_C#_Multithreading - Fatal编程技术网

如何在我的C#应用程序中终止线程?

如何在我的C#应用程序中终止线程?,c#,multithreading,C#,Multithreading,我想在单击按钮事件时终止/销毁应用程序中的线程 private void stop_btn_Click(object sender, EventArgs e) { Thread.Sleep(); } 此事件是否会挂起我的应用程序 这就是从我的线程开始的代码 DataTable myTable = new DataTable();`enter code here` myTable = msgD

我想在单击按钮事件时终止/销毁应用程序中的线程

        private void stop_btn_Click(object sender, EventArgs e)
        {
            Thread.Sleep();
        }
此事件是否会挂起我的应用程序

这就是从我的线程开始的代码

        DataTable myTable = new DataTable();`enter code here`
        myTable = msgDataSet.Tables["text"];
        DataRow[] myRow;
        myRow = myTable.Select();

        for (int x = 0; x < myRow.Count(); x++ )
        {
            SendKeys.SendWait(myRow[x]["msg"].ToString());
            SendKeys.SendWait("{Enter}");
            int sleep = int.Parse(textBox2.Text);
            Thread.Sleep(sleep);
        }
        Thread Spam1 = new Thread(new ThreadStart(Send1));
        Spam1.Start();
DataTable myTable=newdatatable()`在这里输入代码`
myTable=msgDataSet.Tables[“text”];
DataRow[]myRow;
myRow=myTable.Select();
对于(int x=0;x
您编写的代码将使UI线程处于休眠状态->您的应用程序将挂起。如何实现线程?如果您使用BackgroundWorker-您可以,如果您使用Task-您可以提供。如果您使用的是线程-您可以选择方法。
另外,如果您想停止应用程序(主线程)-您可以:

关闭主窗口| |调用应用程序退出| |调用进程终止…

您编写的代码将使UI线程进入睡眠->您的应用程序将挂起。如何实现线程?如果您使用BackgroundWorker-您可以,如果您使用Task-您可以提供。如果您使用的是线程-您可以选择方法。
另外,如果您想停止应用程序(主线程)-您可以:

关闭主窗口| |调用应用程序退出| |调用进程终止…

如果要强制关闭线程,可以调用该函数,该函数将在目标线程上引发ThreadAbortedException

myThread.Abort()

目标线程有机会捕获它并在需要时清理任何资源(当然,如果它想忽略它,也可以通过捕获异常并继续,但这是我的错误做法)

如果您想强制关闭线程,可以调用它在目标线程上引发ThreadAbortedException

myThread.Abort()

目标线程有机会捕获它,并在需要时清理任何资源(当然,如果它想忽略它,也可以只捕获异常并继续,但这是我的错误做法)

请参阅本文,了解为什么永远不应尝试调用
线程。中止

问题是您在该线程中破坏了异常安全性。这是因为
Thread.Abort
将在该线程内的某个任意点引发异常,该点可能在加载资源之后,但在线程进入支持干净卸载该资源的try/catch之前

相反,您应该在该线程中运行的代码中构建合作取消。然后设置某种“取消请求”状态,让线程自行终止。例如:

foreach(var value in aBunchOfData)
{
    if(isCancelled)
    {
        break;
    }

    // Continue processing here...
}
在本例中,您将公开
isCancelled
,并让父线程将其设置为
true


如果您愿意,可以清楚地看到此模式。

请参阅本文,了解为什么您永远不应该尝试调用
线程。中止

问题是您在该线程中破坏了异常安全性。这是因为
Thread.Abort
将在该线程内的某个任意点引发异常,该点可能在加载资源之后,但在线程进入支持干净卸载该资源的try/catch之前

相反,您应该在该线程中运行的代码中构建合作取消。然后设置某种“取消请求”状态,让线程自行终止。例如:

foreach(var value in aBunchOfData)
{
    if(isCancelled)
    {
        break;
    }

    // Continue processing here...
}
在本例中,您将公开
isCancelled
,并让父线程将其设置为
true



如果您。

Thread.Sleep将活动当前(运行stop\u btn\u Click的线程)线程置于睡眠状态,则此模式很清楚,因此应用程序挂起是正常的。您希望终止哪个线程?你的应用程序的主线程?@lvar所以请告诉我如何通过挂断我的应用程序来停止线程?@invisible是的,我想关闭我的应用程序的主线程。要关闭应用程序的主线程(以及其他所有内容),而不保存/清理任何内容等。此
Process.GetCurrentProcess().Kill()
应该这样做。Thread.Sleep将活动的当前线程(运行stop\u btn\u Click的线程)置于睡眠状态,因此应用程序挂起是正常的。您想杀死哪个线程?你的应用程序的主线程?@lvar所以请告诉我如何通过挂断我的应用程序来停止线程?@invisible是的,我想关闭我的应用程序的主线程。要关闭应用程序的主线程(以及其他所有内容),而不保存/清理任何内容等。此
Process.GetCurrentProcess().Kill()
应该可以做到这一点。@lsak savo但是我如何才能访问我的按钮事件的线程名呢?当我访问线程以中止或挂起该线程时,会出现以下错误:名称“Spam1”在当前上下文中不存在您需要保留对它的引用。当您执行myThread=newthread(…)时,您将获得ref@lsak savo但我如何才能访问我的按钮事件的线程名称?当我访问线程以中止或挂起该线程时,会出现以下错误:名称“Spam1”在当前上下文中不存在您需要保留对它的引用。当您执行myThread=newthread(…)时,您将获得ref;但是我怎样才能访问我的按钮事件的线程名呢?当我访问线程以中止或挂起该线程时,会出现以下错误:当前线程中不存在名称“Spam1”context@RizwanKhan:调查背景工人。在主窗体中创建它的实例,并将后台工作程序作为窗体中的成员变量保留。BackgroundWorker为您提供共享取消状态,您可以从两个线程访问该状态。请参阅底部的链接,或google backgroundworker。但是如何访问我的按钮事件的线程名称?当我访问线程以中止或挂起该线程时,会出现以下错误:名称“Spam1”没有