다른 스레드에서 컨트롤의 일부 속성을 업데이트하는 것이 안전한 이유는 무엇입니까?

홍옥

안전 System.Windows.Forms.Control하지 않은 다른 속성과 비교하여 다른 스레드에서 의 속성 일부를 업데이트하는 것이 안전한 이유는 무엇 이며 프로그래머는 Delegate?

예를 들어, ForeColor비교 Text.

누군가 디자인 관점에서 이것을 설명 할 수 있습니까?

TnTinMn

일부 속성 액세스가 불법 크로스 스레드 오류를 발생시키는 이유와 그렇지 않은 이유에 대한 귀하의 질문에 답하려면의 소스 코드를System.Windows.Forms.Control 참조하십시오 . 약간의 파고가 필요하지만 Text속성 을 얻는 것과 같이 스레드로부터 안전한 것으로 일부 액세스가 제안 되었지만 설정 하지 않은 것처럼 보입니다 .

실제로 모든 제어 액세스를 스레드로부터 안전하지 않은 것으로 간주하는 것이 가장 좋은 방법입니다.

public virtual string Text {
    get {
        if (CacheTextInternal) {
            return(text == null) ? "" : text;
        }
        else {
            return WindowText;
        }
    }

    set {
        if (value == null) {
            value = "";
        }

        if (value == Text) {
            return;
        }

        if (CacheTextInternal) {
            text = value;
        }
        WindowText = value;
        OnTextChanged(EventArgs.Empty);

        if( this.IsMnemonicsListenerAxSourced ){
            for( Control ctl = this; ctl != null; ctl = ctl.ParentInternal ) {
                ActiveXImpl activeXImpl = (ActiveXImpl)ctl.Properties.GetObject(PropActiveXImpl);
                if( activeXImpl != null ) {
                    activeXImpl.UpdateAccelTable();
                    break;
                }
            }
        }

    }
}

위 코드에서 내부 WindowText 속성의 사용에 유의하십시오.

    /// <devdoc>
    ///     The current text of the Window; if the window has not yet been created, stores it in the control.
    ///     If the window has been created, stores the text in the underlying win32 control.
    ///     This property should be used whenever you want to get at the win32 control's text. For all other cases,
    ///     use the Text property - but note that this is overridable, and any of your code that uses it will use
    ///     the overridden version in controls that subclass your own.
    /// </devdoc>
    internal virtual string WindowText {
        get {

            if (!IsHandleCreated) {
                if (text == null) {
                    return "";
                }
                else {
                    return text;
                }
            }

            using (new MultithreadSafeCallScope()) {

                // it's okay to call GetWindowText cross-thread.
                //

                int textLen = SafeNativeMethods.GetWindowTextLength(new HandleRef(window, Handle));

                // Check to see if the system supports DBCS character
                // if so, double the length of the buffer.
                if (SystemInformation.DbcsEnabled) {
                    textLen = (textLen * 2) + 1;
                }
                StringBuilder sb = new StringBuilder(textLen + 1);
                UnsafeNativeMethods.GetWindowText(new HandleRef(window, Handle), sb, sb.Capacity);
                return sb.ToString();
            }
        }
        set {
            if (value == null) value = "";
            if (!WindowText.Equals(value)) {
                if (IsHandleCreated) {
                    UnsafeNativeMethods.SetWindowText(new HandleRef(window, Handle), value);
                }
                else {
                    if (value.Length == 0) {
                        text = null;
                    }
                    else {
                        text = value;
                    }
                }
            }
        }
    }

코드 MultithreadSafeCallScope에서 의 사용에 유의하십시오 get. 또한 Handle크로스 스레드 오류를 발생 시키는 속성 의 사용에 유의하십시오 . Handle속성은 크로스 스레드 액세스를 확인 하는 게이트 키퍼 역할을 한다고 생각합니다 .

public IntPtr Handle {
    get {
        if (checkForIllegalCrossThreadCalls &&
            !inCrossThreadSafeCall &&
            InvokeRequired) {
            throw new InvalidOperationException(SR.GetString(SR.IllegalCrossThreadCall,
                                                             Name));
        }

        if (!IsHandleCreated)
        {
            CreateHandle();
        }

        return HandleInternal;
    }
}

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

이것이 스레드로부터 안전한 벡터입니까? 그렇다면 std :: vector의 일부 메서드는 스레드 안전성을 위해 잠금을 요구하는 반면 다른 메서드는 그렇지 않은 이유는 무엇입니까?

분류에서Dev

동일한 클래스의 두 인스턴스가 서로 다른 속성 (Python)을 갖는 것이 합당한 이유는 무엇입니까?

분류에서Dev

한 컨트롤러에서 서비스로 데이터를 전달하고 동일한 이벤트에서 다른 컨트롤러의 해당 데이터에 액세스하는 방법은 무엇입니까?

분류에서Dev

Vaadin 14 : 다른 스레드에서 구성 요소의 CSS 스타일을 업데이트하는 방법은 무엇입니까?

분류에서Dev

URL에 컨트롤러 이름이없는 단일 컨트롤러에서 작업 방법에 대한 다른 URL을 얻는 방법은 무엇입니까?

분류에서Dev

리소스의 일부 작업이 한 컨트롤러로 이동하고 일부는 다른 컨트롤러로 이동하도록 Rails 경로를 올바르게 정의하는 방법은 무엇입니까?

분류에서Dev

WPF는 동일한 컨트롤의 두 종속성 속성을 바인딩하지만 두 개의 데이터 컨텍스트가 필요합니다.

분류에서Dev

다른 스레드에서 컨트롤의 속성 (label.Text) 업데이트

분류에서Dev

다른 열에서 동일한 값을 업데이트하는 방법은 무엇입니까?

분류에서Dev

일부 속성에 대한 할당을 금지하고 Python 객체의 연결된 속성을 업데이트하는 방법은 무엇입니까?

분류에서Dev

div, img 등과 같은 다른 것에 대한 OnClick 이벤트는 컨트롤러의 데이터를 사용하여 작업을 수행합니다.

분류에서Dev

단일 업데이트 쿼리에 대해 다른 열의 값을 기반으로 한 열의 값을 업데이트하는 방법은 무엇입니까?

분류에서Dev

한 컨트롤러의 UILabel을 다른 컨트롤러에서 동적으로 업데이트하는 데 문제가 있습니다. Objective-c에서 체크되는 체크 박스와 일치해야합니다.

분류에서Dev

다른 스레드에서 observeOn (Schedulars.io ())을하는데 onNext ()가 textview를 업데이트하는 이유는 무엇입니까?

분류에서Dev

AngularJS 함수에서 부울을 반환하는 것이 속성과 다른 이유는 무엇입니까?

분류에서Dev

전체 객체를 업데이트하는 것과 다른 디스패치를 사용하여 단일 속성을 업데이트하는 React redux

분류에서Dev

다른 데이터베이스의 동일한 테이블이있는 테이블을 기반으로 데이터베이스의 테이블 레코드를 업데이트하는 방법은 무엇입니까?

분류에서Dev

동일한 사용자가 MySQL에서 자신의 레코드를 업데이트하는 것을 방지하는 방법은 무엇입니까?

분류에서Dev

동일한 테이블의 다른 열로 열을 업데이트하는 방법은 무엇입니까?

분류에서Dev

한 Docker 컨테이너에서 다른 호스트의 다른 컨테이너로 파일을 복사하는 방법은 무엇입니까?

분류에서Dev

UI 컨트롤이없는 다른 클래스의 속성에 속성을 바인딩하는 방법은 무엇입니까?

분류에서Dev

기본 UI 스레드에서 컨트롤을 업데이트하는 올바른 방법은 무엇입니까?

분류에서Dev

한 테이블을 다른 테이블에서 업데이트하는 방법은 무엇입니까?

분류에서Dev

이미 설치된 일부 프로그램을 업데이트하기 위해 .deb 파일을 다운로드해야하는 이유는 무엇입니까?

분류에서Dev

이미 설치된 일부 프로그램을 업데이트하기 위해 .deb 파일을 다운로드해야하는 이유는 무엇입니까?

분류에서Dev

동일한 모델에 대해 Rails 4의 다른 뷰에서 다른 열을 업데이트하는 방법은 무엇입니까?

분류에서Dev

작업이 Android의 다른 스레드에서 실행되는 동안 UI를 업데이트하는 방법은 무엇입니까?

분류에서Dev

magento의 동일한 컨트롤러에서 다른 기능을 사용하는 방법은 무엇입니까?

분류에서Dev

한 데이터베이스에서 다른 데이터베이스로 테이블을 업데이트하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    이것이 스레드로부터 안전한 벡터입니까? 그렇다면 std :: vector의 일부 메서드는 스레드 안전성을 위해 잠금을 요구하는 반면 다른 메서드는 그렇지 않은 이유는 무엇입니까?

  2. 2

    동일한 클래스의 두 인스턴스가 서로 다른 속성 (Python)을 갖는 것이 합당한 이유는 무엇입니까?

  3. 3

    한 컨트롤러에서 서비스로 데이터를 전달하고 동일한 이벤트에서 다른 컨트롤러의 해당 데이터에 액세스하는 방법은 무엇입니까?

  4. 4

    Vaadin 14 : 다른 스레드에서 구성 요소의 CSS 스타일을 업데이트하는 방법은 무엇입니까?

  5. 5

    URL에 컨트롤러 이름이없는 단일 컨트롤러에서 작업 방법에 대한 다른 URL을 얻는 방법은 무엇입니까?

  6. 6

    리소스의 일부 작업이 한 컨트롤러로 이동하고 일부는 다른 컨트롤러로 이동하도록 Rails 경로를 올바르게 정의하는 방법은 무엇입니까?

  7. 7

    WPF는 동일한 컨트롤의 두 종속성 속성을 바인딩하지만 두 개의 데이터 컨텍스트가 필요합니다.

  8. 8

    다른 스레드에서 컨트롤의 속성 (label.Text) 업데이트

  9. 9

    다른 열에서 동일한 값을 업데이트하는 방법은 무엇입니까?

  10. 10

    일부 속성에 대한 할당을 금지하고 Python 객체의 연결된 속성을 업데이트하는 방법은 무엇입니까?

  11. 11

    div, img 등과 같은 다른 것에 대한 OnClick 이벤트는 컨트롤러의 데이터를 사용하여 작업을 수행합니다.

  12. 12

    단일 업데이트 쿼리에 대해 다른 열의 값을 기반으로 한 열의 값을 업데이트하는 방법은 무엇입니까?

  13. 13

    한 컨트롤러의 UILabel을 다른 컨트롤러에서 동적으로 업데이트하는 데 문제가 있습니다. Objective-c에서 체크되는 체크 박스와 일치해야합니다.

  14. 14

    다른 스레드에서 observeOn (Schedulars.io ())을하는데 onNext ()가 textview를 업데이트하는 이유는 무엇입니까?

  15. 15

    AngularJS 함수에서 부울을 반환하는 것이 속성과 다른 이유는 무엇입니까?

  16. 16

    전체 객체를 업데이트하는 것과 다른 디스패치를 사용하여 단일 속성을 업데이트하는 React redux

  17. 17

    다른 데이터베이스의 동일한 테이블이있는 테이블을 기반으로 데이터베이스의 테이블 레코드를 업데이트하는 방법은 무엇입니까?

  18. 18

    동일한 사용자가 MySQL에서 자신의 레코드를 업데이트하는 것을 방지하는 방법은 무엇입니까?

  19. 19

    동일한 테이블의 다른 열로 열을 업데이트하는 방법은 무엇입니까?

  20. 20

    한 Docker 컨테이너에서 다른 호스트의 다른 컨테이너로 파일을 복사하는 방법은 무엇입니까?

  21. 21

    UI 컨트롤이없는 다른 클래스의 속성에 속성을 바인딩하는 방법은 무엇입니까?

  22. 22

    기본 UI 스레드에서 컨트롤을 업데이트하는 올바른 방법은 무엇입니까?

  23. 23

    한 테이블을 다른 테이블에서 업데이트하는 방법은 무엇입니까?

  24. 24

    이미 설치된 일부 프로그램을 업데이트하기 위해 .deb 파일을 다운로드해야하는 이유는 무엇입니까?

  25. 25

    이미 설치된 일부 프로그램을 업데이트하기 위해 .deb 파일을 다운로드해야하는 이유는 무엇입니까?

  26. 26

    동일한 모델에 대해 Rails 4의 다른 뷰에서 다른 열을 업데이트하는 방법은 무엇입니까?

  27. 27

    작업이 Android의 다른 스레드에서 실행되는 동안 UI를 업데이트하는 방법은 무엇입니까?

  28. 28

    magento의 동일한 컨트롤러에서 다른 기능을 사용하는 방법은 무엇입니까?

  29. 29

    한 데이터베이스에서 다른 데이터베이스로 테이블을 업데이트하는 방법은 무엇입니까?

뜨겁다태그

보관