关于C#的异步调用

问题描述

有这么一个类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赋值。。请问下您这种情况应该怎么处理。。谢谢。

时间: 2024-11-17 13:46:47

关于C#的异步调用的相关文章

Windows 8应用开发之异步调用

 不论是桌面客户端还是Web应用通常会出现处理时间较长的操作,为了在这段时间内不影响用户与应用之间的交互体验,开发人员通常会使用异步调用技术,使得比较复杂的逻辑操作由异步进行,用户仍然可以继续使用应用,不会有无响应的等待情况出现. 本篇将通过一个简单的实例演示如何在Windows 8 应用中使用异步编程.首先我们来编写一个"Get Blogs"按钮,点击它可以从Windows Blog中获取博客列表.当然获取博客信息的过程是由异步进行的,这个过程中为了测试用户仍然可以与应用交互,我们再

异步调用Web服务方法

基于Ajax技术构建的门户是web 2.0这一代中最为成功的Web应用程序.而这块市场上iGoogle和Pageflakes这两大站点已经走在了时代的前列. 当你打开Pageflakes,将会看到如下的界面: 接下来就是界面上的各个"部件"去向服务器请求各种web服务,而服务器作为代理,则代为向外部web服务发出请求.(这是因为ajax调用无法跨越,所以常通过代理来请求数据) 问题场景:某个很受用户欢迎的"部件"很长时间不能执行,导致很对请求无法及时执行,引起请求失

开发自己的Web服务处理程序(以支持Ajax框架异步调用Web服务方法)

当你添加Asp.net AJAX功能到你的Web程序的时候,你需要在Web.config中做一些改变,需要你显式地移除默认的ASMX处理程序并且添加asp.net ajax框架自己的脚本处理器来作为ASMX处理程序.在上一篇异步调用Web服务方法中,我们谈论过,ajax框架的asmx(ScriptHandler)是不支持异步调用Web服务方法的,所以为了让asp.netajax支持异步Web方法调用,我们需要避开该处理器,以提供自定义的处理器来取代它. Asp.netAJAX框架的ASMX处理器

为Windows应用创建简单的异步调用模式

简介 最近我编写了很多智能客户端应用,总结了一些能够使应用程序在后台调用Web Service时不冻结前台界面的异步调用方法.虽然当前.NET Framework本身已经提供了异步调 用的机制,但我发现在Windows应用中这一机制比较难于把握,因为这时你需要正确的控制用 户界面线程处理. 在这篇文章中,我将教给您一种在Windows应用程序中实现异步调 用Web服务的简单方法,通过这一方法,您不用再考虑后台线程与前台界面线程的交互关系了 . 服务代理 Visual Studio .NET会生成

ajax异步调用一般处理程序实现下载不弹出保存提示

问题描述 ajax异步调用一般处理程序实现下载不弹出保存提示 前端js代码: function QueryExcel() { var data = Ext.getCmp(""frmMain"").GetValues();// 获取json数据 Ext.Ajax.request({ url: '../Services/ReportExportHandler.ashx' // Webservice的地址以及方法名 jsonData: data method: 'POST

异步调用webservice

     今天学习webservice的异步调用.找了很多都是说会在客户端生成的Proxy类中会生成Begin<方法名>和End<方法名>,然后在这两个方法之间调用自己的代码的方式实现异步操作. 但是,在客户端的Proxy类中没有这样的方法,相反的却有<方法名>Async的方法.这个是不是新的异步调用新的实现方式呢?于是网上找了找发现了两篇很有价值的博文. 一篇引用自http://book.51cto.com/art/200906/129768.htm,是李天平的.  

多线程异步调用 java-多线程异步调用的问题

问题描述 多线程异步调用的问题 请改造以下类,使之在多线程异步调用时,而不会出数据覆盖,即并发冲突 pulbi class Math { private static int result = 0; public static int sum(int a, int b){ result = a + b; return result; } } 请教大神 怎么做 解决方案 如果不考虑同步控制粒度问题,直接把synchronized(Math.class) 加在当前类定义上的,是可行的 当然控制同步的

写个JavaScript异步调用框架(Part 1

问题 在Ajax应用中,调用XMLHttpRequest是很常见的情况.特别是以客户端为中心的Ajax应用,各种需要从服务器端获取数据的操作都通过XHR异步调用完成.然而在单线程的JavaScript编程中,XHR异步调用的代码风格实在是与一般的JavaScript代码格格不入. 额外参数 考虑一个除法函数,如果它是纯客户端的同步函数,那么签名会是这样的: function divide(operand1, operand2) 然而假设我们对客户端除法的精度不满意,于是把除法转移到服务器端来执行

.Net组件程序设计之异步调用

说到异步调用,在脑海中首先想到就是BeginInvoke(),在一些常用对象中我们也会常常见到Invoke()和 BeginInvoke(), 要想让自己的组件可以被客户端调用或者是异步调用,这样的设计是合理的,这也是组件异步机制当中的一条 (说句题外话--其实大多数知识都隐藏在我们平时经常见到的对象或者是代码里,只不过是没有去细心的发现) 在.NET中首先就会想到使用委托来进行异步调用,关于委托的定义在 委托与事件一文中已经大概的说过了,文中只是对委托进行了 大概的讲解,并没有对委托的使用来说

XMLHTTP实现数据的异步调用

xml|数据|异步 演示:http://asp2004.net/temp/treemenu/async.asp源代码下载:http://asp2004.net/dvbbs/Dispbbs.asp?boardid=4&ID=89&replyID=375&skin=1<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTM