问题描述
各位好:Wind接口是用来给用户获取实时的股票数据的,小弟要使用的是其中的wsq()方法。因为该接口的C#版本的用户手册貌似没有及时更新,我们这里无法给出具体的语法。(但是该接口提供了一个叫做“命令生成器”的小工具,用于生成调用相关方法的代码。因此,我能确保具体的语法是准确的)小弟使用的代码如下,然而始终得不到接口返回的数据,不知道错在哪里?usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingWAPIWrapperCSharp;//接口dllusingWindCommon;//用于处理返回数据的格式转换,也是接口提供的namespaceWSQ2String{classWSQ2StringSample{//主程序staticvoidMain(){Console.Write("Begin......");Console.ReadLine();//----API登陆WindAPIw=newWindAPI();//生成接口实例Console.WriteLine("NewAPIcreated!");w.start();//登陆接口Console.WriteLine("APIstarted!");//----订阅行情interrorId=0;ulongreqId=w.wsq(referrorId,"150195.sz","rt_date,rt_time,rt_lastest","",myCallback);//调用wsq方法订阅行情Console.WriteLine("errorId={0}",errorId);//加入语句控制用户程序的向后执行Console.ReadLine();//在键入任意键后,我们便可以中止行情的订阅w.cancelRequest(reqId);w.stop();Console.Write("End......");Console.ReadLine();}//回调函数定义staticvoidmyCallback(ulongreqId,WindDatawd){Console.WriteLine("wsqdatagotback......");//WindData类型转换,并输出到屏幕strings=WindDataMethod.WindDataToString(wd,"wsq");//接口提供的用于将其自定义的数据类型转换成stringConsole.Write(s);}}}
以上代码中,我已尽可能的注释了。因为代码的执行功能也非常简单,因此相信大家能够看清楚的。关键是,小弟没有使用回调函数的经验,不知道我的使用中烦了什么错误,导致始终无法得到返回的数据。。。。请各位指教!
解决方案
解决方案二:
补充以下:1、小弟使用上述代码的框架输出了wind接口的其它方法函数的返回数据(是一般的成员方法),没有出现问题。因此,猜想是使用回调函数的过程中产生了错误。2、小弟对回调函数的理解是:我们在调用的订阅行情的方法(wsq)时,提供了用于给接口回调的回调函数(myCallback)。接口将使用另一条线程,调用回调函数,并通过其中的参数wd,来返回我们要查询的数据。而我们的主程序则会停留在readline这一步。3、因此,我们仅需确保在事件触发接口回调时,我们所提供的回调函数仍可以被调用即可!请各位指点以下
解决方案三:
这是我的代码运行的结果:
解决方案四:
呵呵,这如果是WindAPI本身的问题,那么它有可能是在一个“windows桌面应用”上而不是“控制台应用”上设计的。为了避免引入复杂性,你还是创建一个窗口应用吧。我猜你的问题不会发生了。
解决方案五:
修复一下wind插件。
解决方案六:
我想这是因为控制台程序的原因Console.ReadLine();阻塞了主进程运行你换成winform应该就没问题了至于你说的回调函数,在C#里我们理解为委托。有关这块你理解有问题,委托/回调并不基于线程(当然你倒是可以在线程里调用委托,但他本身并不基于线程)
解决方案七:
http://www.docin.com/p-711392084.html
解决方案八:
代码看光只能解决语法问题,还是要能运行才能解决运行过程的问题.
解决方案九:
把myCallback声明为public看看Wind接口不是提供有C#调用说明吗,你看了没有?
解决方案十:
引用8楼xuzuning的回复:
把myCallback声明为public看看Wind接口不是提供有C#调用说明吗,你看了没有?
谢版主回复。。。我考虑了一下,确实,我们提供的回调函数是给接口从我们的类(wsq2stringsample)外部使用的。因此应该声明为public。以下是我们使用该接口自带的命令生成器所得的示范代码:但是,我们将myCallback声明为public后,所得的结果和之前仍是一样的。即输出errorId后,便没有反应了。。。(虽然我们是在股市收盘后调用的,此时价格不会实时更新,但至少应该有首次返回的价格,如同上图命令生成器中返回的,我们也是在收盘后使用命令生成器后,得到的首次价格的输出)还请版主指点
解决方案十一:
引用5楼wanghui0380的回复:
我想这是因为控制台程序的原因Console.ReadLine();阻塞了主进程运行你换成winform应该就没问题了至于你说的回调函数,在C#里我们理解为委托。有关这块你理解有问题,委托/回调并不基于线程(当然你倒是可以在线程里调用委托,但他本身并不基于线程)
感谢您的答复:1、winform我还不会用,需要研究一下,看看如何替代控制台;2、若委托回调不基于线程,你说的“阻塞了主进程的运行”中的“主进程”是指的什么?3、若是进程有分主次,那么异步回调应该也是各管各的执行吧?即是主进程执行readline,当事件触发后接口通过次进程调用myCallback。否则的话,异步回调不是没法实现了吗?请指教
解决方案十二:
1.C#接口库文件C#接口不随安装包一起发布。用户需要从大奖章网站手动下载:http://www.dajiangzhang.com/downloadWind量化平台-接口库文件-C#解压后的文件夹中,WAPIWrapperCSharp.dll为C#库文件;Samples为例子;doc为帮助文档;src为C#接口源代码,有经验的开发者,可以根据自己的需求改进C#接口,甚至开发其它语言的Wind量化接口,比如SaS。2.C#接口使用注意事项在您的程序中直接引用类型库即可编程。使用之前,可以手动通过cmd命令进入Wind安装目录,通过输入regsvr32windmatlab.ocx进行注册,也可以通过Wind终端修复任意wind插件实现。如果您把您编写的程序发布到其他机器使用,请确认在目标机器上已经安装了Microsoft.NetFramework4.0他应该使用了COM组件,但你贴出的代码中看不到这一点
解决方案十三:
有个问题不知你了解过否Wind接口需要用手机号注册,那么他是否会从话费中提取他的服务费?电信的网路电视会,但他从不跟你说
解决方案十四:
引用11楼xuzuning的回复:
1.C#接口库文件C#接口不随安装包一起发布。用户需要从大奖章网站手动下载:http://www.dajiangzhang.com/downloadWind量化平台-接口库文件-C#解压后的文件夹中,WAPIWrapperCSharp.dll为C#库文件;Samples为例子;doc为帮助文档;src为C#接口源代码,有经验的开发者,可以根据自己的需求改进C#接口,甚至开发其它语言的Wind量化接口,比如SaS。2.C#接口使用注意事项在您的程序中直接引用类型库即可编程。使用之前,可以手动通过cmd命令进入Wind安装目录,通过输入regsvr32windmatlab.ocx进行注册,也可以通过Wind终端修复任意wind插件实现。如果您把您编写的程序发布到其他机器使用,请确认在目标机器上已经安装了Microsoft.NetFramework4.0他应该使用了COM组件,但你贴出的代码中看不到这一点
额,我采用类似的框架,调用了wind接口提供的wsi()方法,并成功输出到屏幕;因此,在安装及使用接口方面,我认为应该是没有问题的。。。。主要还是在回调的使用上。