如何在我的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”没有