UI 表单事件阻止我的其他股票代码 API 如何防止这种情况
本文关键字:API 代码 何防止 情况 事件 表单 其他 我的 UI | 更新日期: 2023-09-27 17:55:19
我有一个通过事件机制收集股票报价的API(dll)。如下面:
...
using MT4API;
public partial class Blue : Form
{
...
public Blue()
{
...
string symbol = "GBPUSD";
MT4DDE dde = new MT4DDE("");
dde.OnQuote += new System.EventHandler<QuoteEventArgs>(MT_OnQuote);
dde.Connect();
dde.Subscribe(symbol);
....
这个想法是,在每个图表刻度上,我都会得到一个事件。 下面是事件处理程序代码:
private static void MT_OnQuote(object sender, QuoteEventArgs args)
{
GlobalClass.Ask = args.Ask;
GlobalClass.Bid = args.Bid;
// I have back ground worker code that updatestables from the global class
}
这一切都很好用。只要我不触摸表单 UI 上的任何其他按钮。只要我点击UI表单上的按钮...我不再从我的 API 接收事件,UI 应用程序正常运行,但没有来自 API 的数据。
为什么来自 UI 的事件会阻止来自 API 事件的任何进一步事件?
知道这里发生了什么吗?或者建议如何设计这个?
如果您注释掉从全局对象更新表的代码,是否会出现同样的问题? 如果你注释掉后台工作线程?
最好区分事件是在按下 UI 上的某个按钮后停止触发,还是仅在执行编写的某行代码后停止触发。
为了能够为您提供帮助,我们需要知道 MT4DDE 类上的事件是如何触发的。
如果您有此类的代码,发布它会有所帮助。
如果不这样做,则可能需要使用 Reflector 等工具将程序集反编译为 C#,并查看 MT4DDE 类正在执行的操作,这可能会导致它停止调用事件。
此外,如果您正在执行与后台线程相关的任何操作,或者正在对应用程序的主消息循环执行任何异常操作,则最好在此处提及它。
我尝试使用 invoke 命令,它可以工作,但在几个事件后它停止了......以下是隔离的代码:
使用MT4API;
命名空间 WindowsFormsApplication1{ 公共代表无效更新文本回调(双重询问,双重出价);
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
string symbol = "GBPUSD";
MT4DDE dde = new MT4DDE("");
dde.OnQuote += new EventHandler<QuoteEventArgs>(MT_OnQuote);
dde.Connect();
dde.Subscribe(symbol);
}
private void updateTickDisplay(double ask, double bid)
{
textBox1.Text = ask.ToString();
textBox2.Text = bid.ToString();
}
private void button1_Click(object sender, EventArgs e)
{
this.Close();
}
private void MT_OnQuote(object sender, QuoteEventArgs args)
{
BeginInvoke(new UpdateTextCallback(this.updateTickDisplay),
new object[] { args.Ask, args.Bid });
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
textBox3.Text = textBox1.Text;
}
}
}
与真实代码的唯一区别是我使用的是数据网格。而不是文本字段。但很明显,UI 以某种方式阻止了新事件。奇怪的是,我得到了大约 5 到 10 个事件,然后它就停止了。奇怪。关于不同设计的任何想法?