스레딩 오류를 피하기 위해 invoke를 사용하는 적절한 방법은 무엇입니까?

사용자 3803552

나는 최근에 C #을 배우고 있으며 머리를 감쌀 수없는 문제가 있습니다. C #을 처음 접했지만 내 질문은 대리자와 호출에 관한 것이므로 이것이 멍청한 경우 용서해주십시오. 나는 온라인에서 많은 튜토리얼을 읽고 이것에 대한 많은 비디오 튜토리얼을 보았지만 여전히 코드에서 동일한 오류가 발생하고 미묘한 부분을 파악하지 못하는 것 같습니다. 내가 이해했듯이 대리자는 함수에 대한 포인터이며 다른 스레드에서 해당 함수를 호출하여 텍스트 상자를 업데이트하는 데 사용할 수 있습니다. 대리자를 만드는 것을 이해합니다. 제가 옳은 일을한다고 생각하지만 위협에서 대리자를 호출 할 때 항상 크로스 스레드 작업이 유효하지 않습니다. 생성 된 스레드 이외의 스레드에서 액세스 한 'textBox1'제어 오류가 발생 합니다. 의 위에.

콜백은 설계된 함수를 호출하기 때문에 작동하는 것처럼 보이지만 이런 식으로 수행하는 요점이라고 생각한 올바른 스레드에서 수행하지 않는 것 같습니다. 경고 중단을 false로 설정하는 옵션이 있다는 것을 알고 있지만 내가 뭘 잘못하고 있는지,이 유형의 메서드를 올바르게 코딩하는 방법을 배우고 싶습니다. 나는 더 이상 튜토리얼이 내가 어디에서 잘못되었는지 이해하는 데 더 가까워지고 있는지 확실하지 않으므로 제공 할 수있는 도움, 제안 또는 답변에 감사드립니다.

내 코드는 매우 기본적이며 멀티 스레딩을위한 적절한 코딩의 가장 기본적인 개념을 이해하려고합니다. 아래는 내 코드입니다.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Media;
using System.Threading;
using System.Reflection;

namespace WindowsFormsApplication3
{   

    //declair delegate name(vars) CORRECT
    public delegate void Textboxdelegate(Int64 MyVar);

    public partial class Form1 : Form
    {

         public Form1()
         {
             InitializeComponent();
         }

         public void button1_Click(object sender, EventArgs e)
         {
             runme();
         }

         public void runme()
         {
             textBox1.Text = "87";
             textupdate(44);

             int target = 0;
             Textboxdelegate TD = new Textboxdelegate(textupdate);
             Number number = new Number(target, TD);
             TD(11);
             Thread thread1 = new Thread(new ThreadStart(number.worker));
             thread1.Start();

         }
        public void textupdate(Int64 cntr) 
        {
           textBox1.Text += cntr.ToString();
        }

    }

    class Number
    {

    int _target;
    Textboxdelegate _callbackMethod;

    public Number(int target, Textboxdelegate TDD)
    {
        this._target = target;
        this._callbackMethod = TDD;
    }

    public void worker()
    {

            Int64 counter = 0;
            byte[] lifeforms = new byte[2146435071];

            for (long y = 1; y <= 2146; y++)
            {

                for (long X = 1; X <= 1000000; X++)
                {
                    lifeforms[X * y] = 20;
                }

                counter += 1;
                if(_callbackMethod != null)
                {
                _callbackMethod(counter);
                }

            }

            MessageBox.Show("Done!");
        }

    }
}
테리 보지 오

이 조잡한 예제는 원하는 작업을 수행해야합니다.

    //public delegate void Textboxdelegate(Int64 MyVar);

    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }

        public Action<Int64> Textboxdelegate;
        public void runme()
        {
            textBox1.Text = "87";
            textupdate(44);

            int target = 0;
            Textboxdelegate = textupdate;
            Number number = new Number(target, Textboxdelegate,this);
            Textboxdelegate(11);
            Thread thread1 = new Thread(new ThreadStart(number.worker));
            thread1.Start();

        }
        public void textupdate(Int64 cntr)
        {
            textBox1.Text += cntr.ToString();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            runme();
        }

    }

    class Number
    {

        int _target;
        Action<Int64> _callbackMethod;
        Form1 frm;

        public Number(int target, Action<Int64> act,Form1 frm)
        {
            this._target = target;
            this._callbackMethod = act;
            this.frm = frm;
        }

        public void worker()
        {

            Int64 counter = 0;
            byte[] lifeforms = new byte[214643507];

            for (long y = 1; y <= 2146; y++)
            {

                for (long X = 1; X <= 100000; X++)
                {
                    lifeforms[X * y] = 20;
                }

                counter += 1;
                if (_callbackMethod != null)
                {
                    if (frm.InvokeRequired)
                    {
                        frm.Invoke(_callbackMethod,new object[]{counter});
                    }
                    else
                    {
                        _callbackMethod(counter);
                    }
                }

            }

            MessageBox.Show("Done!");
        }

    }

컨트롤은 스레드 친 화성을 가지므로 컨트롤을 생성 한 스레드에서만 액세스 할 수 있으며 다른 스레드에서 액세스 할 수 있습니다. 이제 Control 클래스의 Invoke 메서드 (폼의 기본 및 모든 컨트롤)를 사용하면 안전하게 액세스하십시오 (매우 요약 된 설명).

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Flutter / dart에서 향후 오류를 단위 테스트하는 적절한 방법은 무엇입니까?

사용자를 찾기 위해 make에서 적절한 if else를 구성하는 방법은 무엇입니까?

적절한 오류 처리를 위해 MetaTrader4 오류 코드 새로 고침을 사용하는 방법은 무엇입니까?

스토리 보드를 사용할 때 모달을 해제하는 적절한 방법은 무엇입니까?

반응 형 UI를 갖기 위해 파생 속성에서 스케줄러를 사용하는 적절한 방법은 무엇입니까?

TopicExistsException 간헐적 오류를 수정하기 위해 EmbeddedKafkaRule / EmbeddedKafka를 사용하여 Spring Kafka 테스트를 설정하는 방법은 무엇입니까?

적절한 로더가 필요한 npm 오류를 해결하는 방법은 무엇입니까?

작업을 다시 시작하기 위해 비행 중 스레드를 종료하는 적절한 방법은 무엇입니까?

시간 초과 오류를 해결하기 위해 erlang gen_server에서 효율적으로 수신 절을 사용하는 방법은 무엇입니까?

일치하는 속성을 확인하기 위해 LINQ를 사용하여 두 컬렉션을 반복하는 적절한 방법은 무엇입니까?

자바 스크립트에서 적절한 오류 처리를 수행하는 방법은 무엇입니까?

Bash 스크립트에서 유형 오류를 필터링하는 적절한 방법은 무엇입니까?

NullPointer 오류를 피하기 위해 TextView를 초기화하는 방법은 무엇입니까?

vscode를 사용하여 npm 스크립트를 디버그하는 적절한 방법은 무엇입니까?

div를 맨 위로 이동하는 적절한 방법은 무엇입니까?

스레딩을 사용하는 동안 winerror32를 해결하는 방법은 무엇입니까?

값에 쉼표가있는 피드를 크롤링하기 위해 스크래피 CSVFeedSpider를 사용하는 방법은 무엇입니까?

하위 구조체 인스턴스의 적절한 벡터를 만드는 방법은 무엇입니까?

django REST 프레임 워크를 사용하는 "적절한"방법은 무엇입니까?

비즈니스 논리를 적용하기 위해이 LINQ를 작성하는 방법은 무엇입니까?

WCF 서비스 : 오류를 이해하기 위해 서버 로그를 찾는 방법은 무엇입니까?

inotify를 사용하는 적절한 방법은 무엇입니까?

C ++ ncurses 프로젝트에서 뮤텍스를 사용하는 적절한 방법은 무엇입니까?

Serializable Java 클래스에서 Logger를 사용하는 적절한 방법은 무엇입니까?

한 스레드가 실패 할 때 다중 스레딩 코드를 종료하는 적절한 방법은 무엇입니까?

Java에서 특수 문자를 피하기 위해 URL을 인코딩하는 방법은 무엇입니까?

16 WebGL 컨텍스트 오류를 피하기 위해 WebGL 컨텍스트를 올바르게 처리하는 방법은 무엇입니까?

컨테이너 내의 나머지 수평 공간을 채우기 위해 flex를 사용하는 적절한 방법은 무엇입니까?

Swing에서 적절한 테이블을 만들고 적절한 레이아웃을 사용하여 모든 요소를 해당 위치에 배치하는 방법은 무엇입니까?

TOP 리스트

  1. 1

    Ionic 2 로더가 적시에 표시되지 않음

  2. 2

    JSoup javax.net.ssl.SSLHandshakeException : <url>과 일치하는 주체 대체 DNS 이름이 없습니다.

  3. 3

    std :: regex의 일관성없는 동작

  4. 4

    Xcode10 유효성 검사 : 이미지에 투명성이 없지만 여전히 수락되지 않습니까?

  5. 5

    java.lang.UnsatisfiedLinkError : 지정된 모듈을 찾을 수 없습니다

  6. 6

    rclone으로 원격 디렉토리의 모든 파일을 삭제하는 방법은 무엇입니까?

  7. 7

    상황에 맞는 메뉴 색상

  8. 8

    SMTPException : 전송 연결에서 데이터를 읽을 수 없음 : net_io_connectionclosed

  9. 9

    정점 셰이더에서 카메라에서 개체까지의 XY 거리

  10. 10

    Windows cmd를 통해 Anaconda 환경에서 Python 스크립트 실행

  11. 11

    다음 컨트롤이 추가되었지만 사용할 수 없습니다.

  12. 12

    C #에서 'System.DBNull'형식의 개체를 'System.String'형식으로 캐스팅 할 수 없습니다.

  13. 13

    JNDI를 사용하여 Spring Boot에서 다중 데이터 소스 구성

  14. 14

    Cassandra에서 버전이 지정된 계층의 효율적인 모델링

  15. 15

    복사 / 붙여 넣기 비활성화

  16. 16

    Android Kotlin은 다른 활동에서 함수를 호출합니다.

  17. 17

    Google Play Console에서 '예기치 않은 오류가 발생했습니다. 나중에 다시 시도해주세요. (7100000)'오류를 수정하는 방법은 무엇입니까?

  18. 18

    SQL Server-현명한 데이터 문제 받기

  19. 19

    Seaborn에서 축 제목 숨기기

  20. 20

    ArrayBufferLike의 typescript 정의의 깊은 의미

  21. 21

    Kubernetes Horizontal Pod Autoscaler (HPA) 테스트

뜨겁다태그

보관