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 表单事件阻止我的其他股票代码 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 个事件,然后它就停止了。奇怪。关于不同设计的任何想法?