C# 线程无法开启窗口的原因
开发碰到很棘手的问题, 寻找解决方法. 品味程序出错过程, 逐步跟踪程序执行过程, 每一行代码每一条语句全部执行, 怪了, 大白天碰到鬼了. 主窗口加入一个按钮, 按钮的作用就是执行主窗口的事件, 启动程序, 点击按钮, 程序正确创建一个窗口, 按照这个测试结果来看, 事件处理中的代码没有任何问题. 在执行程序, 跟踪, 寻找出错的过程. 我觉得程序没有问题, 不应该出现错误; 但是真的出错了, 说明程序一定有问题, 问题是什么呢, 没有答案; 想起以前高人语录: 计算器程序设计就是这么简单, 别管教授专家高手, 写程序出来到计算器上面一跑就知道谁的程序正确, 是骡子是马需要牵出来溜溜. 呀, 找不到答案, 转而上网, 到论坛尽量寻找这种错误相关信息, 时间浪费很多, 结果不是很好, 没有找到答案. 之后和 faust 聊天, 询问这种问题, 他指出一定是讯息回圈和线程之间交互这两个问题中的一个. 顺着 faust 的思路到论坛寻找答案, 很快找到相关讯息.
揭晓最终解决答案, 事件是一个同步处理过程, 就是说虽然子线程触发主窗口事件, 可是执行的线程仍然是子线程, 创建一个窗口 From frm1 = new Form(); Form.Show(); 能够执行, 可是无法收到 Windows Print() 事件, 所以窗口创建没有问题, 就是没有画出窗口上面的东东, 所以窗口像死掉的窗口一样, 反白的. 找到原因怎么处理问题呢? 在线程里面使用 delegateDefine delegateTest = new delegateDefine(this.m_from.eventFunction); this.m_from.Invoke(delegateTest); 就能正常执行程序了. 解决里面最重要的是 Invoke, 如果有兴趣可以看看 Invoke 的介绍.
从问题出现到问题搞定, 花费十个小时, 太辛苦了.
附: 异步委派程序设计范例
下列程序代码示范 .NET 异步程序设计的用法,使用简单类别将一些数字因子分解。
[C#]
using System;
using System.Threading;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Messaging;
// Create an asynchronous delegate.
public delegate bool FactorizingAsyncDelegate (
int factorizableNum,
ref int primefactor1,
ref int primefactor2);
// Create a class that factorizers the number.
public class PrimeFactorizer
{
public bool Factorize(
int factorizableNum,
ref int primefactor1,
ref int primefactor2)
{
primefactor1 = 1;
primefactor2 = factorizableNum;
// Factorize using a low-tech approach.
for (int i=2;i<factorizableNum;i++)
{
if (0 == (factorizableNum % i))
{
primefactor1 = i;
primefactor2 = factorizableNum / i;
break;
}
}
if (1 == primefactor1 )
return false;
else
return true ;
}
}
// Class that receives a callback when the results are available.
public class ProcessFactorizedNumber
{
private int _ulNumber;
public ProcessFactorizedNumber(int number)
{
_ulNumber = number;
}
// Note that the qualifier is one-way.
[OneWayAttribute()]
public void FactorizedResults(IAsyncResult ar)
{
int factor1=0, factor2=0;
// Extract the delegate from the AsyncResult.
FactorizingAsyncDelegate fd = (FactorizingAsyncDelegate)((AsyncResult)ar).AsyncDelegate;
// Obtain the result.
fd.EndInvoke(ref factor1, ref factor2, ar);
// Output the results.
Console.WriteLine("On CallBack: Factors of {0} : {1} {2}",
_ulNumber, factor1, factor2);
}
}
// Class that shows variations of using Asynchronous
public class Simple
{
// The following demonstrates the Asynchronous Pattern using a callback.
public void FactorizeNumber1()
{
// The following is the client code.
PrimeFactorizer pf = new PrimeFactorizer();
FactorizingAsyncDelegate fd = new FactorizingAsyncDelegate (pf.Factorize);
int factorizableNum = 1000589023, temp=0;
// Create an instance of the class that is going
// to be called when the call completes.
ProcessFactorizedNumber fc = new ProcessFactorizedNumber(factorizableNum);
// Define the AsyncCallback delegate.
AsyncCallback cb = new AsyncCallback(fc.FactorizedResults);
// You can use any object as the state object.
Object state = new Object();
// Asynchronously invoke the Factorize method on pf.
IAsyncResult ar = fd.BeginInvoke(
factorizableNum,
ref temp,
ref temp,
cb,
state);
//
// Do some other useful work.
//. . .
}
// The following demonstrates the Asynchronous Pattern using a BeginInvoke, followed by waiting with a time-out.
public void FactorizeNumber2()
{
// The following is the client code.
PrimeFactorizer pf = new PrimeFactorizer();
FactorizingAsyncDelegate fd = new FactorizingAsyncDelegate (pf.Factorize);
int factorizableNum = 1000589023, temp=0;
// Create an instance of the class that is going
// to be called when the call completes.
ProcessFactorizedNumber fc = new ProcessFactorizedNumber(factorizableNum);
// Define the AsyncCallback delegate.
AsyncCallback cb =
new AsyncCallback(fc.FactorizedResults);
// You can use any object as the state object.
Object state = new Object();
// Asynchronously invoke the Factorize method on pf.
IAsyncResult ar = fd.BeginInvoke(
factorizableNum,
ref temp,
ref temp,
null,
null);
ar.AsyncWaitHandle.WaitOne(10000, false);
if (ar.IsCompleted)
{
int factor1=0, factor2=0;
// Obtain the result.
fd.EndInvoke(ref factor1, ref factor2, ar);
// Output the results.
Console.WriteLine("Sequential : Factors of {0} : {1} {2}",
factorizableNum, factor1, factor2);
}
}
public static void Main(String[] args)
{
Simple simple = new Simple();
simple.FactorizeNumber1();
simple.FactorizeNumber2();
}
}
相关文章:

给力!斩获 GitHub 14000 Star,两周创办开源公司获数百万美元融资
作者 | 伍杏玲出品 | AI 科技大本营(ID:rgznai100)上世纪 90 年代初,21 岁大学生 Linus Torvalds 开源 Linux 操作系统,自此掀起全球开源浪潮。随后“中国 Linux 第一人”宫敏博士用手提肩背的方式将 20 盒磁带背回中国࿰…

root密码忘记怎么办
开机按e进入系统的紧急求援模式依次输入一下命令:mount -o remount,rw /sysrootchroot /sysrootecho "输入新密码" | passwd --stdin rootexitreboot转载于:https://blog.51cto.com/11552940/1971850

C#内容分页简单实现代码及祥解
//定义变量 int i,start,stop,t,stat,statt,pp,pagecount,pagesize; //变量初始值 stat0; statt0; start0;//开始查询的字符串位置,初始为0 stop0; pagesize2000;//定义每页至少显示字符串数 pagecount0; //获得当前的页数 paRequest.Params["page&qu…

灵活越障、花样空翻,腾讯轮腿式机器人亮相机器人顶会 ICRA
6月3日,腾讯轮腿式机器人Ollie(奥利)正式亮相。它像一个灵活的“轮滑小子”,能完成跳跃、360度空翻等高难度动作。 轮腿式机器人(wheel-legged robot)是近年来机器人研究的前沿领域。Ollie兼具轮式结构和腿…

android学习笔记之十服务(Service)
2019独角兽企业重金招聘Python工程师标准>>> Service拥有一个单独进程的模块. 1,继承自Service类,须实现public IBinder onBind(Intent intent) 2,通过startServie触发运行,stopService终止运行 生命周期: onCreate(如果是第一次运行) -> onStart -> onDest…

宝塔Linux常用命令
https://www.bt.cn/bbs/thread-1186-1-1.html 2017年3月8日发布全新架构的宝塔Linux 面板3.1Beta版,到现在的5.2.0正式版,历经100多天打磨,宝塔研发工程师做了大量优化适配,从最开始的只支持CentOS到现在支持CentOS、Ubuntu、Debi…

EMAIL发送系统(C#+基于SMTP认证) 2.0
这个是对于 EMAIL发送系统(C#基于SMTP认证) 1.0 的改版这个第一版是2002年11月写的,过了一年半了,才有人提意见,就修正了一下,因为后来做的项目一直用不上,也就没有注意到 前段时间有网友反馈了一些问题,这…

“奥利”来啦,腾讯Robotics X实验室跑出的“轮滑小子”
6月3日,腾讯Robotics X实验室的新成员——轮腿式机器人Ollie(奥利)正式亮相,它是机器狗Jamoca、Max和自平衡自行车之后,实验室又一创新成果。轮腿式机器人(wheel-legged robot)是近年来机器人研…

如何写一篇好的技术博客
在工作过程中,发现对很多东西都一知半解,不是很透澈,到头来很容易模糊,如果有一篇好的技术博客予以总结,一来即使忘记了,回国头来再看,仍然能 够从自己的思路中恢复;二来总结一下&am…

使用react心得
为什么80%的码农都做不了架构师?>>> 在使用react中,总会碰到这样那样的问题,如何解决这些问题,希望能够随着时间的积累,慢慢成熟! 在react中的renden函数里,不能使用setState这个方法,不然会死循环,原因:是因为setState会触发render,而render后又触发se…

将Byte数组转化为String
FCL得很多方法的返回值都是包含字符的Byte数组而不是返回一个String,这样的方法包含在如下的类中: System.Net.Sockets.Socket.Receive System.Net.Sockets.Socket.ReceiveFrom System.Net.Sockets.Socket.BeginReceive System.Net.Sockets.Socket.B…

[题解]UVA10054 The Necklace
链接:http://vjudge.net/problem/viewProblem.action?id18806 描述:给出一堆珠子,每个珠子有两种颜色,有一端颜色相同的珠子可以串在一起,问是否可以把所有珠子串在一起,并求其中一种方案。 思路ÿ…

程序员大厂不一定要进,算法必须要学!收藏89篇精选算法文章
为什么程序员都需要学算法?程序员对算法通常怀有复杂情感,算法很重要是共识,但是否每个程序员都必须学算法是主要的分歧点。很多人觉得像人工智能、数据搜索与挖掘这样高薪的工作才用得上算法,觉得算法深不可测。在面试中…

专有云到混合云,是云计算的下半场?
查获案件案值达数十亿,为国家挽回近十亿元税款,是海关情报系统在全国应用一年后交出的答卷。 海关情报系统是海关总署与阿里云专有云共同搭建海关大数据云平台后推出的首个应用。 专有云的使命:激发政企大脑潜能 十年前,自己动手D…

C# 2.0 的partial
partial 关键字的作用是将你的 class 分为多个部分,编译器会将多个部分拼到一起去。 public partial class SampleClass ...{ public void MethodA() ...{ } } public partial class SampleClass ...{ public void MethodB() ...{ } } 和 public class Sa…

findbugs:may expose internal representation by ret
2019独角兽企业重金招聘Python工程师标准>>> findbugs:1. *** getXXX() may expose internal representation by returning ***.getXXX 2. *** setXXX(DATE )may expose internal representation by storing an externally mutable object into setXXX *…

AI时代的幕后英雄:谁在生产高质量的AI训练数据?
在AI浪潮的推动下,软件正在朝着更「智能」的方向发展。2017年,特斯拉人工智能部门主管、李飞飞高徒Andrej Karpathy提出了「软件2.0」的概念。 什么是「软件2.0」?其实就是神经网络。 在「软件1.0」时代,程序员用Java、Python、…

Webpack 核心开发者 Sean Larkin 盛赞 Vue
dev.io 近日邀请了 Webpack 核心开发者 Sean Larkin 回答开发者提问,其中几个问提比较有意思,和掘金的小伙伴们分享一下。 先上点前菜: 有一个开发者问 Sean 如何成为一个热门项目的核心作者。Sean 没有一上来就说该做什么,而是先…

设计模式C#描述——单例与多例模式
设计模式C#描述——单例与多例模式 作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。 单例模式有以下特点: 单例类只能有一个实例。 单例类必须自己创建自己的唯一实例。 单…

Nutch插件开发及发布流程
2019独角兽企业重金招聘Python工程师标准>>> 一,插件开发流程: 1,Nutch开发客户端环境搭建 2,plugin的源代码则保存在/src/java/org/apache/nutch/parse/self/ 类实现实例: public class CustomizedIndexin…

网红 AI 高仿坎爷发布说唱情歌,歌迷:堪比真人原声
来源 | Hyper超神经头图 | 下载于视觉中国近日,一个基于 Tacotron2 和 Transformer 实现文字转声音的 AI 应用——Uberduck.AI 破圈了,不少 TikTok 、YouTube 网红博主都在推荐这一神器。YouTube 的网红音乐艺术创意机构 Herr Fuchs 发布了一首新歌&…

设计模式C#描述——抽象工厂模式
设计模式C#描述——抽象工厂模式 阅读此文应先阅读简单工厂模式与工厂方法模式 抽象工厂模式是对象的创建模式,它是工厂方法模式的进一步推广。 假设一个子系统需要一些产品对象,而这些产品又属于一个以上的产品等级结构。那么为了将消费这些产品对象的责…

怎样才能学好Vue,听听尤雨溪怎么说?
如果你想问前端最值得学习的框架是什么,我一定会毫不犹豫地告诉你是Vue。无论你是技术小白还是前端工程师,Vue的重要性自不必多说。从首个Commit的提交到破茧重生的Vue3、Vite2,Vue凭借轻量级、简单易学等优势,不仅荣登GitHub Rep…

如何彻底卸载mysql(xp)
如何彻底卸载mysql 完整的卸载MySQL 5.x 的方法: 1、控制面板里的增加删除程序内进行删除 2、删除MySQL的安装文件夹C:\Program Files\MySQL,如果备份好,可以直接将文件夹全部删除 3、开始->运行-> regedit 看看注册表里这几个地方删…

(一)JNDI基础
一、简介 在Tomcat 4.1.27之后,在服务器上就直接增加了数据源的配置选项,直接在服务器上配置好数据源连接池即可。在J2EE服务器上保存着一个数据库的多个连接。每一个连接通过DataSource可以找到。DataSource被绑定在了JNDI树上(为每一个Data…

C# Idioms: Enum还是Enum Class(枚举类)
原文排版格式:http://www.marshine.com) reversion:2004/5/28 修改说明:感谢Ninputer提到的CLS兼容问题,同时修改了原来版本没有提及的Equals改写,以及修改""重载的不完善代码,和增加enum struct内容 reversion:2004/6…

构建第三代人工智能核心能力,清华、阿里、RealAI等联合发布最新AI安全评估平台
科技是发展的利器,也可能成为风险的源头。近日,张钹院士在智源大会上表示,AI的发展带来了科技是发展的利器,也可能成为风险的源头。近日,张钹院士在智源大会上表示,AI的发展带来了新的风险和安全隐患。 在…

Java 事件响应
按钮按钮(JButton)在界面设计中用于激发动作事件。按钮可显示文本,当按钮被激活时,能激发动作事件。JButton常用构造方法有:JButton():创建一个没有标题的按钮对象;JButton(String s):创建一个标题为s的按钮…

C# Idioms: Safely方法
(原文排版格式 http://www.marshine.com) 名称 Safely Method 意图 通过方法保证返回有效(不为空引用,null或Nothing)的对象或抛出异常,当存在多个调用者时简化调用者需要处理null返回值的代码。 动机 一个存放对象的集合或类似功…

Akka的Actor编程
2019独角兽企业重金招聘Python工程师标准>>> ActorSystem(“companyname”) 相当于注册一家公司一样,负责: 通用配置 如:dispatchers, deployments, remote capabilities and addresses 创建Actor和搜索actor 通常一个应用一个…