问题描述
有这么一个类TestA,在主窗体中,每点击一次按钮便需要实例化一次TestA并调用他的Get()方法,并将result值显示出来。其中,OpenCompleted()为Open()操作成功后的事件,result的值将在这里赋值请问如何正确从主窗体调用并实例化获取返回值表达能力不太好,直接贴代码。。谢谢namespaceTest{publicclassTestA{intresult;publicvoidGet(){Open();}privatevoidOpen(){//dosomething}privatevoidOpenCompleted(){result=0;}}}
解决方案
解决方案二:
Test里面的三个方法都改成返回int值,再依次return到上一层,最后在form里调用intret=test.Get()。是这个意思吗?
解决方案三:
你是要委托吗?
解决方案四:
AutoResetEvent
解决方案五:
引用1楼destiny_03的回复:
Test里面的三个方法都改成返回int值,再依次return到上一层,最后在form里调用intret=test.Get()。是这个意思吗?
但是OpenCompleted()是事件啊。。要怎么返回。。。
解决方案六:
引用2楼娃都会打酱油了的回复:
你是要委托吗?
您的意思是使用回调函数么。。。
解决方案七:
引用3楼Saleayas的回复:
AutoResetEvent
查了一下好像是这个意思,待会儿实践一下,谢谢。
解决方案八:
你的TestA类达不到基本的接口功能。首先它没有获取result的接口方法,其次你也根本没有能用代码表达出“事件”的概念。给你写一个demopublicclassTestA:INotifyPropertyChanged{intresult;publicintResult{get{returnresult;}privateset{result=value;if(PropertyChanged!=null)PropertyChanged(this,newPropertyChangedEventArgs("Result"));}}publicintTm{set{tm=value;}}inttm;publicvoidDoIt(){Thread.Sleep(tm);//dosomethingthis.Result=1234;}publiceventPropertyChangedEventHandlerPropertyChanged;}
那么在你的程序中使用它,可以写varobj=newTestA();obj.PropertyChanged+=(s,arg)=>{if(arg.PropertyName=="Result"){this.label1.Text=obj.Result;}obj.DoIt();};
这里的DoIt方法是异步地抛出结果Result的,因此使用事件通知形式。这里其实根本跟所谓的“线程”并没有直接的关系。不要一谈到异步就硬拉上线程。除非明确说到“异步线程操作”这样的描述,否则,异步回调不一定是子线程触发的,父线程(主线程)也完全可以触发。不要对“线程”过度敏感。假设你想兼容主线程和子线程的情况,那么可以把操作控件的代码放到BeginInvoke委托中。即this.label1.BeginInvoke((Action)delegate{this.label1.Text=obj.Result;});
或者Dispatcher.BeginInvoke((Action)delegate{this.label1.Content=obj.Result;});
解决方案九:
你在TestA类上没有接口概念。具体来说需要在两方面搞明白:INotifyPropertyChanged是一个编程模式,应该熟练使用。同时,应该了解event的语法、用法。不要随便写一个OnXXXX的方法就说成是“事件”。
解决方案十:
调用程序的demo中有个别语句是手工打的,写错了,改正一下啊:varobj=newTestA();obj.Tm=3000;obj.PropertyChanged+=(s,arg)=>{if(arg.PropertyName=="Result"){this.label1.Text=obj.Result;}};obj.DoIt();
解决方案十一:
引用9楼sp1234的回复:
调用程序的demo中有个别语句是手工打的,写错了,改正一下啊:varobj=newTestA();obj.Tm=3000;obj.PropertyChanged+=(s,arg)=>{if(arg.PropertyName=="Result"){this.label1.Text=obj.Result;}};obj.DoIt();
谢谢您的耐心指导,按照您的方法已成功实现功能这个程序的场景是充当一个服务端的角色,每当客户端请求数据时需要开一个线程并实例化TestA,Get()操作完成后返回给客户端关于INotifyPropertyChanged,第一次接触这个东西,觉得.Net真是博大精深啊。。。好多书上都没有这些介绍。。
解决方案十二:
引用9楼sp1234的回复:
调用程序的demo中有个别语句是手工打的,写错了,改正一下啊:varobj=newTestA();obj.Tm=3000;obj.PropertyChanged+=(s,arg)=>{if(arg.PropertyName=="Result"){this.label1.Text=obj.Result;}};obj.DoIt();
再打扰一下您。。还有个问题这个TestA类中需要调用一个WebBrowser来抓取一些内容,抓取代码在DocumentCompleted函数中(也就是上文的OpenCompleted),主进程每接到一个客户端请求就新建一个线程并实例化TestA来抓取数据,按照您上文所说,我已成功实现了返回Result但WebBrowser只支持STA模式,当处于STA模式中,DocumentCompleted不会被触发,也就是说不能为Result赋值。。请问下您这种情况应该怎么处理。。谢谢。