UI 스레드에서 정보를 얻고 C#의 다른 스레드를 얻는 데 도움이 필요합니다.

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

문제

네트워크를 통해 정보를 수신하고 처리하는 서버 응용 프로그램이 있습니다. 서버는 멀티 스레드이며 시간에 여러 개의 소켓을 처리하며, 해당 콜백 함수에 의해 묶인 BeginInvoke 및 EndinVoke 스타일 메소드를 통해 내 컨트롤없이 스레드가 생성됩니다.

메인 GUI 외에도 현재 연결된 소켓을 설명하는 항목으로 채워진 목록 상자 항목을 표시하는 양식을 작성하려고합니다. 따라서 기본적으로하려는 것은 적절한 콜백 함수가 실행되는 스레드에서 add () 함수를 사용하여 Listbox에 항목을 추가하는 것입니다. 컨트롤 속성을 통해 내 양식 컨트롤에 액세스하고 있습니다 -IE :

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

당연히 나는 단지 기능을 부르지 않고, 여기에서 찾은 몇 가지 방법을 시도했고 웹에서 스레드간에 통신하기 위해 MethodInvoker, a delegate,와 함께 Invoke(), BeginInvoke() 아무것도 작동하지 않는 것 같습니다. 나는 항상 제어가 생성 된 스레드 이외의 스레드에서 내 컨트롤에 액세스되었다고 말하는 것과 같은 예외를 얻습니다.

이견있는 사람?

도움이 되었습니까?

해결책

해당 제어를 만든 스레드에서 대의원을 호출하려면 액세스하는 ListBox 컨트롤에서 Invoke (또는 BeginVoke) 호출해야합니다.

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

다른 팁

나는 항상이 라인을 따라 무언가를 사용했습니다.

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

나는 또한 도움을주기 위해 많은 도우미 확장 방법을 썼습니다.

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

다음과 같이 사용 :

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

BeginInvoke 또는 Invoke를 사용하면 제대로 작동해야합니다. 문제를 보여주는 짧지 만 완전한 프로그램을 게시 할 수 있습니까? 실제로 서버 측 물건이 필요하지 않은 일을 작동시킬 수 있어야합니다. 들어오는 연결을 받기 위해 "척"하는 스레드가 많이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top