C#,无法访问已释放的对象。对象名:“Form1”。

这两天初学C#,在写异步托管代码的时候,遇到这么个问题,UI界面已经关闭的同时,DLC指到我之前一句           

    while (!flag)
            {
                this.Invoke(mi); ///////这里报错
                Thread.Sleep(100);
            }

自以为是程序退出的时候由于系统速度过快又去访问了一次mi这个资源,但是点退出的同时系统已经把这个资源释放了,所以报错

然后强制在退出时把flag写为true,程序还是会进这个循环(debug确认了这里为true,但是进入了循环),所以搞不懂了

想了很多办法都无解,最后把其换成

    while (!flag)
            {
                this.BeginInvoke(mi);
                Thread.Sleep(100);
            }

解决问题

看了某篇帖子,别人遇到和我一样的问题,最后反编译发现BeginInvoke在这里和Invoke得区别是BeginInvoke不做异常处理

这样虽然不报错了,但是感觉治标不治本,问题放在这,等以后C#更加熟练了再回头看

 

下班前又看到一个帖子,明白了为什么BeginInvoke不报错,因为BeginInvoke所调用的内容是在UI线程内执行。这样就与我们的异步调用思想违背了。

而且也无法达到以多线程去降低UI线程负载的效果

具体在这个帖子http://zhangbq168.blog.163.com/blog/static/23735305200801754232259/

 

无法访问释放对象!!!!!

10-16

以下是form1的代码:rnusing System;rnusing System.Collections.Generic;rnusing System.ComponentModel;rnusing System.Data;rnusing System.Drawing;rnusing System.Linq;rnusing System.Text;rnusing System.Windows.Forms;rnrnnamespace _20080517S2rnrn public partial class MainForm : Formrn rn From2 fa;rn public MainForm()rn rn InitializeComponent();rn fa = new From2();rn fa.MdiParent = this;rn fa.WindowState = FormWindowState.Maximized;rn fa.button1.Click += new EventHandler(button1_Click);rn rn rn rn void button1_Click(object sender, EventArgs e)rn rn MessageBox.Show(fa.Timu);rn fa.Close();rn rn rn rn rn private void 增加题目ToolStripMenuItem_Click(object sender, EventArgs e)rn rn fa.Show();rn rn rnrnrnrn下面是form2的代码:rnusing System;rnusing System.Collections.Generic;rnusing System.ComponentModel;rnusing System.Data;rnusing System.Drawing;rnusing System.Linq;rnusing System.Text;rnusing System.Windows.Forms;rnrnnamespace _20080517S2rnrn public partial class From2: Formrn rn public From2()rn rn InitializeComponent();rn rn public string Timurn rn get return this.textBox1.Text; rn rn public string XX1rn rn get return this.textBox2.Text; rn rn public string XX2 rn get return this.textBox3.Text; rn rn public string XX3 rn get return this.textBox4.Text; rn rn public string XX4 rn get return this.textBox5.Text; rn rnrn private void button1_Click(object sender, EventArgs e)rn rn MessageBox.Show(this.Timu);rn rn rn rnrnrnrn第一次点击”增加题目“时 form2 正常SHOW出来!rnrn输入完后 点FORM2的Button1关闭rnrn然后第二次点击“增加题目”的时候就会出现 “无法访问已释放的对象” 的错误rnrn为什么会这样 rnrn环境:VS2008 论坛

没有更多推荐了,返回首页