0

我有一个通过事件机制收集股票报价的 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 事件的任何进一步事件?

知道这里发生了什么吗?或者建议如何设计这个?

4

2 回答 2

0

如果您注释掉从全局对象更新表的代码,是否会出现同样的问题?如果您注释掉后台工作人员?

最好区分事件是在您按下 UI 上的某个按钮后立即停止触发,还是仅在编写的某行代码被执行后才停止触发。

为了能够帮助您,我们需要知道 MT4DDE 类上的事件是如何触发的。

如果您有此类的代码,发布它会有所帮助。

如果您不这样做,您可能希望使用 Reflector 等工具将程序集反编译为 C#,并查看 MT4DDE 类正在做什么,这可能会导致它停止调用事件。

此外,如果您正在做任何与后台线程相关的事情,或者如果您正在对应用程序的主消息循环做任何不寻常的事情,那么在这里提及它是一个好主意。

于 2013-01-21T23:55:00.560 回答
0

我尝试使用调用命令,它可以工作,但是在发生一些事件后它停止了......这是隔离的代码:

使用 MT4API;

namespace WindowsFormsApplication1 { public delegate void UpdateTextCallback(double ask, double bid);

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 个事件,然后它就停止了。奇怪的。关于不同设计的任何想法?

于 2013-01-22T18:47:04.190 回答