不总是调用事件处理程序

本文关键字:事件处理 程序 调用 | 更新日期: 2023-09-27 18:25:05

我有一个自定义线程,它解析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,在这里我有一个点击事件处理程序。我观察到,有时不会调用事件处理程序,但在大多数情况下会调用

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

不总是调用事件处理程序

您的代码阻塞主线程,使用单独的线程更新网络详细信息。下面是它的快速示例。

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; }