Проблема обновления интерфейса Windows Mobile 6 - PullRequest
0 голосов
/ 27 мая 2011

У меня есть приложение для Windows Mobile, написанное на C #, которое имеет больше диалогов. Я хочу обновить диалог, когда событие срабатывает. Вот код:

 public void ServerStateChanged()
        {
            // update the interface
            try
            {
                if (this.Focused)
                {
                    this.noConnectionsLL.Text = this.tcpServer.ClientsCount.ToString();
                }
            }
            catch (Exception exc)
            {
            }
        }

Код работает несколько раз, но затем я получаю это System.NotSupportedException с этой трассировкой стека: at Microsoft.AGL.Common.MISC.HandleAr()\r\nat System.Windows.Forms.Control.get_Focused()\r\nat DialTester.Communication.TCPServerView.ServerStateChanged()\r\nat ...

Имеет ли значение, из какого потока инициируется событие? потому что я не могу понять, в чем проблема, почему это работает несколько раз, а затем происходит сбой.

Ответы [ 2 ]

2 голосов
/ 28 мая 2011

Или путь ламбы, как показано ниже. И прежде чем меня будут критиковать за использование Control.BeginInvoke, BeginInvoke является поточно-ориентированным и полностью асинхронным (вызов поместит обновление в очередь событий пользовательского интерфейса).

    public void ServerStateChanged()  
    {
        this.BeginInvoke((Action)(() =>
        {
            if (this.Focused)
            {
                this.noConnectionsLL.Text = this.tcpServer.ClientsCount.ToString();
            }     
        }));
    }
0 голосов
/ 27 мая 2011

Вероятно, это проблема с несколькими потоками. Проверка this.InvokeRequired в верхней части функции и соответствующая реакция определенно повысят безопасность функции. Как то так:

public void ServerStateChanged()         
{
    if(this.InvokeRequired)
    {
        this.Invoke(new delegate
        {
            ServerStateChanged();
        }
        return;
    }

    if (this.Focused)                 
    {                     
        this.noConnectionsLL.Text = this.tcpServer.ClientsCount.ToString();
    }             
}             
...