我刚刚开始学习c#中的线程和方法调用,但我遇到了一个无法解决的问题。
我做了一个基本的C#表单程序,通过启动一个线程和调用委托,不断更新和显示一个数字。
在Form1_load开始新的线程:
private void Form1_Load(object sender, EventArgs e)
{
t = new System.Threading.Thread(DoThisAllTheTime);
t.Start();
}
Public void始终显示此消息(该消息会不断更新号码):
public void DoThisAllTheTime()
{
while(true)
{
if (!this.IsDisposed)
{
number += 1;
MethodInvoker yolo = delegate() { label1.Text = number.ToString(); };
this.Invoke(yolo);
}
}
}
现在,当我单击表单的X按钮时,出现以下异常:
类型System的未处理异常。发生在System.窗户。Forms.dll
无法更新已删除对象的
虽然我确实检查了表格是否被处理了。
编辑:我在修复问题的代码中添加了cat(ObjectDisposedExc0019 ex)。工作代码:
public void DoThisAllTheTime()
{
while(true)
{
number += 1;
try {
MethodInvoker yolo = delegate() { label1.Text = number.ToString(); };
this.Invoke(yolo);
}
catch (ObjectDisposedException ex)
{
t.Abort();
}
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
Thread.CurrentThread.Abort();
}
只需将此重写放在表单类中:
protected override void OnClosing(CancelEventArgs e) {
t.Abort();
base.OnClosing(e);
}
您对的调用将执行此操作。IsDisposed
总是过时。您需要截获表单关闭事件并显式停止线程。这样你就根本不必做IsDisposed
测试了。
有很多方法可以做到这一点。就我个人而言,我会使用系统。穿线。任务
命名空间,但如果您想继续使用系统。线程化
,您应该定义一个成员变量\u updateThread
,并在加载事件中启动它:
_updateThread = new System.Threading.Thread(DoThisAllTheTime);
_updateThread.Start();
然后在你的闭幕式中:
private void Form1_Closing(object sender, CancelEventArgs e)
{
_stopCounting = true;
_updateThread.Join();
}
最后,将IsDisposed
测试替换为检查新\u stopCounting
成员变量的值:
public void DoThisAllTheTime()
{
MethodInvoker yolo = delegate() { label1.Text = number.ToString(); };
while(!_stopCounting)
{
number += 1;
this.Invoke(yolo);
}
}
问题内容: 我目前在关闭应用程序的CTRL-C期间关闭异步协程时遇到问题。下面的代码是我现在所拥有的简化版本: 如果按CTRL-C,会给我以下输出: 我对asyncio的经验不是很丰富,所以我很确定我在这里缺少重要的东西。真正让我头疼的是输出之后的部分。从开始,我必须承认我不知道发生了什么。我查看了其他问题,但无法正常工作。那么,为什么这段代码输出类似的东西?如何干净地关闭协程呢? 谢谢你的帮助!
在将基础设施从JEE6迁移到Jee7之后,我在Quartz调度器中得到了一个“resultset is closed”异常。 是:9.0.0.10 DB2:v11.1.4.4 DB2 JDBC:11.1.3_4.22.38(与11.1.4.4的行为相同) jpa:hibernate-jpa-2.1-api:1.0.2.final JTA:1.2 Spring:5.1.4 Hibernate:5.2
问题内容: 我对Python和多线程编程非常陌生。基本上,我有一个脚本可以将文件复制到另一个位置。我希望将其放置在另一个线程中,以便可以输出以指示脚本仍在运行。 我遇到的问题是,如果无法复制文件,它将引发异常。如果在主线程中运行,这没关系;但是,使用以下代码不起作用: 在线程类本身中,我尝试重新抛出异常,但是它不起作用。我已经看到这里的人问类似的问题,但是他们似乎都在做比我想做的事情更具体的事情(
问题内容: 下面的代码尝试做到这一点。 该代码将永远循环并检查是否有任何待处理的请求要处理。如果存在,它将创建一个新线程来处理请求并将其提交给执行者。一旦所有线程完成,它将休眠60秒,然后再次检查未决请求。 我的问题是这些线程完成的大多数处理都是针对数据库的。该程序将在Windows计算机上运行。当有人尝试关闭或注销计算机时,这些线程会发生什么?如何正常关闭正在运行的线程以及执行程序? 问题答案:
问题内容: 我有一个Python程序,当我使用退出应用程序时 ,脚本不会关闭。我的过程仍显示在运行的过程中。 为什么python线程不能关闭? 问题答案: 您需要将该线程设为守护程序线程。为此,请在调用线程的init之后添加以下行 当只有守护程序线程处于活动状态时,程序将退出,主线程当然是非守护程序的
从终端执行jar时,我得到以下信息: 我搜索了他的错误,发现了一些相同的执行输出错误,但没有解决我的情况。 下面详细介绍了文件的位置、清单内容、所采取的终端步骤以及所涉及的两个类文件的代码内容。 文件位置 > SWT库 舱单 班级 普通人。jar(参见下面的创建): Manifest.txt内容: 终端动作 > 目录更改 . jar创建 舱单检查 普通人。jar执行 密码 用户nterface.c