不总是调用事件处理程序

时间:2014-09-30 22:05:54

标签: c# events handler

我有自定义线程解析WiFi网络并更新UI(DataGridView和图形)。这是线程方法:

private void RefreshThread()
{
    var watch = Stopwatch.StartNew();
    while (true)
    {
        UpdateAllNetworks();
        UpdateAllInterferences();
        UpdateAllColors();

        switch (ActivePage)
        {
            case Page.Start:
                break;
            case Page.Networks:
                this.Invoke((MethodInvoker)delegate
                {
                    UpdateDataGridWithNetworks();
                    ClearGraphs();
                    Draw24GHzGraph();
                    DrawSignalsOverTimeGraph();
                });
                break;
            case Page.Channels:
                break;
            case Page.Analyze:
                break;
            default:
                break;
        }
        watch.Stop();
        int elapsedMs = (int) watch.ElapsedMilliseconds;

        if (elapsedMs < Constants.NetworksRefreshThreadInterval)
            Thread.Sleep(Constants.NetworksRefreshThreadInterval - elapsedMs);
    }
}

自定义DataGridView:

public class CustomDataGridView : DataGridView
{
...
    protected override void OnCellClick(DataGridViewCellEventArgs e)
    {
        base.OnCellClick(e);
        int Index = e.RowIndex;

        if (Index != -1)
        {
            DataGridViewRow row = Rows[Index];
            PrimaryKeyForSelectedRow = row.Cells[KeyName].Value.ToString();
        }
    }
}

DataGridView是我的自定义DataGrid,我有一个click事件处理程序。我观察到有时事件处理程序没有被调用,但在大多数情况下它是。

可能是什么问题?它与多线程有关还是事件没有排队?

1 个答案:

答案 0 :(得分:0)

您的代码阻止主线程,使用单独的线程进行网络详细信息更新。以下是它如何完成的快速示例。

class Program
{
    static void Main(string[] args)
    {
        var helper = new Looper(5000, YourMethod_RefreshThread);
        helper.Start();
    }

    private static void YourMethod_RefreshThread()
    {
        Console.WriteLine(DateTime.Now);
    }
}

public class Looper
{
    private readonly Action _callback;
    private readonly int _interval;

    public Looper(int interval, Action callback)
    {
        if(interval <=0)
        {
            throw new ArgumentOutOfRangeException("interval");
        }
        if(callback == null)
        {
            throw new ArgumentNullException("callback");
        }
        _interval = interval;
        _callback = callback;
    }

    private void Work()
    {
        var next = Environment.TickCount;

        do
        {
            if (Environment.TickCount >= next)
            {
                _callback();
                next = Environment.TickCount + _interval;
            }
            Thread.Sleep(_interval);

        } while (IsRunning);
    }

    public void Start()
    {
        if (IsRunning)
        {
            return;
        }
        var thread = new Thread(Work);
        thread.Start();
        IsRunning = true;
    }

    public void Stop()
    {
        this.IsRunning = false;
    }

    public bool IsRunning { get; private set; }