Precisa de ajuda recebendo informações através de um segmento interface do usuário e outro segmento em C #

StackOverflow https://stackoverflow.com/questions/229254

Pergunta

Eu tenho um aplicativo de servidor que recebe informações através de uma rede e processa-lo. O servidor é tomadas múltiplas multi-threaded e alças de tempo, e tópicos são criados sem o meu controle através de métodos estilo BeginInvoke e EndInvoke, que são encadeadas por funções de retorno de chamada correspondente.

Eu estou tentando criar um formulário, além da GUI principal, que exibe um item de ListBox povoada por itens que descrevem as tomadas atualmente conectados. Então, o que eu estou basicamente tentando fazer é adicionar um item à ListBox usando sua função add (), a partir do thread a função de retorno de chamada apropriada está sendo executado. Eu estou acessando meus controles de formulários através da propriedade Controls - I.E:

(ListBox)c.Controls["listBox1"].Items.Add();

Naturalmente, eu não basta chamar a função, eu tentei várias maneiras que eu encontrei aqui e na web para comunicação entre os segmentos, incluindo MethodInvoker, usando um delegate, em combinação com Invoke(), BeginInvoke() etc. Nada parece trabalho, eu sempre obter a mesma exceção dizendo-me o meu controle foi acessado de um thread diferente daquele em que foi criado.

Qualquer pensamento?

Foi útil?

Solução

Você tem que chamar Invoke (ou BeginInvoke) no controle de caixa de listagem que você está acessando para que o delegado para ser chamado no segmento que criou esse controle.

ListBox listBox = c.Controls["listBox1"] as ListBox;
if(listBox != null)
{
   listBox.Invoke(...);
}

Outras dicas

Eu sempre usei algo ao longo destas linhas:

        c = <your control>
        if (c.InvokeRequired)
        {
            c.BeginInvoke((MethodInvoker)delegate
            {
                //do something with c
            });
        }
        else
        {
            //do something with c
        }

Eu também escrevi um monte de métodos de extensão ajudante para ... ajuda.

using System;
using System.ComponentModel;
public static class CrossThreadHelper
{
    public static bool CrossThread<T,R>(this ISynchronizeInvoke value, Action<T, R> action, T sender, R e)
    {
        if (value.InvokeRequired)
        {
            value.BeginInvoke(action, new object[] { sender, e });
        }

        return value.InvokeRequired;
    }
}

usado como este:

     private void OnServerMessageReceived(object sender, ClientStateArgs e)
    {
        if (this.CrossThread((se, ev) => OnServerMessageReceived(se, ev), sender, e)) return;
        this.statusTextBox.Text += string.Format("Message Received From: {0}\r\n", e.ClientState);
    }

Usando BeginInvoke ou invocar deve funcionar bem. Você poderia postar um curto, mas completo programa que demonstra o problema? Você deve ser capaz de um trabalho de que na verdade não precisa de nenhum material do lado do servidor -. Só tem um monte de tópicos que "fingem" para receber conexões de entrada

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top