winform使用UI多线程编程后,如何释放

zerodegrees 2010-12-20 02:57:02

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public delegate void InvokeMethodDelegate(string name);

private void button1_Click(object sender, EventArgs e)
{
DoWithCommon();
}

private void DoWithCommon()
{
WaitCallback waitCallBack = new WaitCallback(this.InvokeMethod);
ThreadPool.QueueUserWorkItem(waitCallBack, "Knights Warrior");
}
private void InvokeMethod(object x)
{
this.Invoke(new InvokeMethodDelegate(this.ChangeUIWithCommon), x.ToString());
}
private void ChangeUIWithCommon(string name)
{
this.button1.Text = name;
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
//在InvokeMethod运行过程中,关闭窗体,如何才能释放该连接呢

}
}

提示错误:Cannot access a disposed object.
各位帮忙看看~~~
...全文
262 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaohul305 2010-12-21
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 luminji 的回复:]
引用 9 楼 xiaohul305 的回复:
线程池中的线程都是后台线程吧,你关闭的时候应该不会有你说的问题啊??
你确定是这里的问题吗?


线程池中的线程是后台线程没有错,但后台线程不会立刻随着当前窗体关闭而退出,而是会立刻随着当前应用程序退出而退出。

所以,楼主,你这样想让其自动退出线程是不行的。在UI中,首先建议使用的是BackgroundWorker。其次才是线程池。但是……
[/Quote]
非常感谢给予的纠正!!!我还真是搞错了!
不过请问你说的那个设置一个属性的做法不知道你是如何实现的,如果你设置了属性在你的子线程中进行判断这个属性是否为某个状态 ,那么请问你是在什么位置判断这个状态呢?我的费时操作很可能是等待服务器返回数据的操作,那该如何处理呢?
  • 打赏
  • 举报
回复
汗,来晚了
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xiaohul305 的回复:]
线程池中的线程都是后台线程吧,你关闭的时候应该不会有你说的问题啊??
你确定是这里的问题吗?
[/Quote]

线程池中的线程是后台线程没有错,但后台线程不会立刻随着当前窗体关闭而退出,而是会立刻随着当前应用程序退出而退出。

所以,楼主,你这样想让其自动退出线程是不行的。在UI中,首先建议使用的是BackgroundWorker。其次才是线程池。但是如果你要不想用BackgroundWorker,而又想对线程进行控制的话,就只能用Thread了。

当然,所有这样做都是有问题的。正确的做法,你应该为你的工作线程提供Canceled属性,在你关闭线程的时候为其置为true。
zerodegrees 2010-12-20
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xiaohul305 的回复:]
线程池中的线程都是后台线程吧,你关闭的时候应该不会有你说的问题啊??
你确定是这里的问题吗?
[/Quote]

是的。
但我发现直接用Application.ExitThread();
就行了。
结贴了。
xiaohul305 2010-12-20
  • 打赏
  • 举报
回复
线程池中的线程都是后台线程吧,你关闭的时候应该不会有你说的问题啊??
你确定是这里的问题吗?
zerodegrees 2010-12-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lovesongforever 的回复:]
我按照你的程序测了下没报错。
[/Quote]
这只是一个测试程序,之所以不报错是因为那个程序很快就走完了。
问题是假如该线程处理时间很长,而你在其处理过程中关闭主窗体,这时候就会报错了。
garfieldzf 2010-12-20
  • 打赏
  • 举报
回复
我按照你的程序测了下没报错。
wudliang 2010-12-20
  • 打赏
  • 举报
回复
        private void InvokeMethod(object x)
{
if (this.IsDisposed) return;
this.Invoke(new InvokeMethodDelegate(this.ChangeUIWithCommon), x.ToString());
}


在线程池中的线程是由线程池管理的。
chinawes 2010-12-20
  • 打赏
  • 举报
回复
thread.Abort()方法。
zerodegrees 2010-12-20
  • 打赏
  • 举报
回复
各位帮忙看看,当窗体关闭时,如何解决该问题呢
zerodegrees 2010-12-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dunao 的回复:]
public delegate void MyInvoke(string str);




private void button9_Click(object sender, EventArgs e)
{
//_myInvoke = new MyInvoke(SetText);
//CheckForIllegalCrossThreadCalls = false;
……
[/Quote]

o(╯□╰)o

我问的是如何释放,不是栗子。。。
CraxyMouse 2010-12-20
  • 打赏
  • 举报
回复
public delegate void MyInvoke(string str);




private void button9_Click(object sender, EventArgs e)
{
//_myInvoke = new MyInvoke(SetText);
//CheckForIllegalCrossThreadCalls = false;
Thread t = new Thread(new ThreadStart(fun));
t.Start();
}

private void fun()
{
//_myInvoke("dddd");
SetText("ddd");
}
private void SetText(string s)
{
if (textBox6.InvokeRequired)
{
MyInvoke _myInvoke = new MyInvoke(SetText);
this.Invoke(_myInvoke, new object[] { s });
}
else
{
this.textBox6.Text = s;
}
}
zerodegrees 2010-12-20
  • 打赏
  • 举报
回复
各位帮忙看看

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧