c# 请问如何在多线程任务中结束全部线程,关闭窗体?

如上。我需要在命令行下启动一个线性用来加载窗体,命令行读入用户指令操作窗体。那么当窗体被close时,如何连带主线程一起结束掉?
Application.Exit()不好用呀。
MainThread.Abort()也不行
closed事件中写入只能结束窗体不能结束主线程。哪有father?我把主线程用参数传递到窗体执行的Abort()但是没有效果。

很感谢二楼。但是我用的是命令行。跟窗体执行Dispose()方法……那个。不太一样不太一样。
主线程用来读命令,另外的一个线程启动窗体Application.Run(MainWindow);

Thread thread1 = new Thread(new ThreadStart(accp1));
thread1.IsBackground = true;
thread1.Start();

thread1.IsBackground = true;
上面的意思是把这个新线程设置成(前台或着后台...我忘了)线程,,,也就是当启动它的主进程关闭的时候它也关闭.
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-05-06
最好的方法是用委托啦
在线程窗体的close事件中:
this.invoke()参数怎么填 忘了。
this是主窗体,至于怎么传给线程窗体,不难吧。
我做了个小测试 ,我这么写是可以关掉主窗体的
主窗体:
namespace test
{
public partial class Form1 : Form
{
public delegate void delegateclose();
delegateclose D;
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
D = new delegateclose(cccc);
Thread t = new Thread(new ThreadStart(threadstart));
t.Start();
}

private void threadstart()
{
delegateclose ddd = new delegateclose(this.newform);
this.Invoke(ddd);

}

private void newform()
{
Form2 f = new Form2(this, D);
f.Show();
}

public void cccc()
{
this.Dispose();
}
}
}
线程窗体:
namespace test
{
public partial class Form2 : Form
{
Form1 F;
Form1.delegateclose D;
public Form2(Form1 f,Form1.delegateclose d)
{
InitializeComponent();
F = f;
D = d;
}

private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
F.Invoke(D);
}
}
}
第2个回答  2009-05-06
在closed事件里写。
顺便把father也结束掉。
第3个回答  2020-01-04
最好的方法是用委托啦
在线程窗体的close事件中:
this.invoke()参数怎么填
忘了。
this是主窗体,至于怎么传给线程窗体,不难吧。
我做了个小测试
,我这么写是可以关掉主窗体的
主窗体:
namespace
test
{
public
partial
class
Form1
:
Form
{
public
delegate
void
delegateclose();
delegateclose
D;
public
Form1()
{
InitializeComponent();
}
private
void
button1_Click(object
sender,
EventArgs
e)
{
D
=
new
delegateclose(cccc);
Thread
t
=
new
Thread(new
ThreadStart(threadstart));
t.Start();
}
private
void
threadstart()
{
delegateclose
ddd
=
new
delegateclose(this.newform);
this.Invoke(ddd);
}
private
void
newform()
{
Form2
f
=
new
Form2(this,
D);
f.Show();
}
public
void
cccc()
{
this.Dispose();
}
}
}
线程窗体:
namespace
test
{
public
partial
class
Form2
:
Form
{
Form1
F;
Form1.delegateclose
D;
public
Form2(Form1
f,Form1.delegateclose
d)
{
InitializeComponent();
F
=
f;
D
=
d;
}
private
void
Form2_FormClosed(object
sender,
FormClosedEventArgs
e)
{
F.Invoke(D);
}
}
}
第4个回答  2019-08-09
可以用线程的
join方法
等待线程结束。

c#怎样在关闭窗体时结束整个进程
当进行多线程程序设计的时候,主窗体关闭,往往子线程还在继续运行,这就需要在关闭主窗体之前收回线程。设置一个主窗体的关闭事件,在关闭事件中,对子线程做回收处理。如果是在关闭子窗口的时候关闭整个进程,可以执行,Environment.Exit(0)结束进程。

C# WinForm程序中,使用多线程,在关闭窗体时 怎么关闭窗体的所有线程。使...
程序退出的方法:this.Close(); 只是关闭当前窗口,若不是主窗体的话,是无法退出程序的,另外若有托管线程(非主线程),也无法干净地退出;Application.Exit(); 强制所有消息中止,退出所有的窗体,但是若有托管线程(非主线程),也无法干净地退出;Application.ExitThread(); 强制中止调用线程上的...

C#中关闭程序时如何自动结束正在运行的线程?
\/\/窗体关闭事件中添加如下代码 if(this.thread != null || this.thread.IsAlive){ this.thread.Abort();this.thread = null;} \/\/就OK了

c# 如何解决 窗体关闭还不释放资源的问题
你左转右转把图片保存到本地替换掉这个动作肯定没关闭流连接。这样你关闭了窗体,但整个应用程序进程还在,这个进程就占用着这些图片,所以你删除的时候就报错了。你仔细看看你替换图片那部分的代码,看看有没有资源没释放的。

[C#] 一个窗口中打开另一个窗口并关闭当前窗口代码
this);f2.Show();} form2代码 private Form1 f1;public Form2(Form1 f){ InitializeComponent();f1 = f;f1.Hide();} private void Form2_FormClosing(object sender, FormClosingEventArgs e){ f1.Close();} 直接关闭的方法我没有实现,还是通过隐藏,在最后同时关闭销毁两个form实现 ...

c#窗体发生自动关闭
子线程并不会关闭窗体,即使发生错误,我觉得你可能出在的问题是在:线程会向FormA窗体上传递一些反馈信息这个地方,你有可能没使用委托,来回调窗体方法而发生:线程间操作无效: 从不是创建控件“???”的线程访问它。

C# 跳转到另一个Form窗体时如何关闭当前Form窗体
首先,在主窗体的构造函数中加载登录窗体,如果用户验证成功,再构造主窗体,如果不成功,就结束程序。登录系统后,通过按钮或是什么事件调用第三个窗体,在第三个窗体没关闭前使主窗体不可用,代码如下:(如主窗体为frmMain,登录窗体为frmLogin,第三个窗体为frmView)public partial class frmMain : Form...

C#多线程同用全局变量,怎样保持每个线程的变量不会被别的线程把值覆盖...
所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。通常由操作系统负责多个线程的调度和执行。拓展:多线程块模型在每个进程里只有一个块而不是多个块。这单个块控制着多个线程而不是单个线程。这里不需要消息队列,因为所有的线程都是相同的块的一个部分,并且可以共享。这样的程序比单线程模型...

C#多线程跳来跳去的问题
… \/\/线程结束后,清除启动标志 this.starting = false; } }2)在窗体timer1_Tick中 private void timer1_Tick(object sender, EventArgs e) { LongTask lt = LongTask.Instance; lt.StartLongTask(); }在timer1_Tick中,由于LongTask是按单一实例实现,且LongTask 中的函数...

C#等待执行完成后再接着执行后续的,请问要如何设计?
其中m_fmProgress为窗体,你将窗体的FormBorderStyle设为None,StartPosition设ScreenCenter,在画面设置Label显示内容 bw_DoWork 方法为要进行的动作 比如动态改变等待信息 m_fmProgress.lblDescription.Invoke((MethodInvoker) delegate(){ m_fmProgress.lblDescription.Text = "Processing file ";} );m_fm...

相似回答