문제

IE (6+) 용 도구 모음을 작성하고 있습니다. 나는 다양한 샘플 막대를 사용했습니다

Codeproject.com (http://www.codeproject.com/kb/dotnet/ie_toolbar.aspx), 작동하는 도구 모음이 작동하고 등록되지 않은 등록 등을 등록합니다. 도구 모음이 원하는 것은 사용자의 마우스가 해당 DIV를 통해 이동함에 따라 HTML 페이지 내에서 DIV를 강조하는 것입니다. 지금까지 강조 표시 코드는 작동하지만 도구 모음의 레이블에 DIV의 이름 (존재하는 경우)을 표시하고 싶습니다 (마우스가 움직일 때 변경).

나는 내 인생 에서이 일이 일어나도록 할 수 없으며 디버깅을 시도하는 것은 악몽입니다. 어셈블리가 IE에서 호스팅되면서, 나는 해당 제어를 만들지 않은 스레드에서 레이블의 텍스트를 업데이트하려고 시도함으로써 예외를 일으키고 있다고 생각합니다. 보지 마세요.

Invoke를 사용하여 스레드 안전 방식으로 컨트롤을 업데이트하려는 솔루션입니까? 그렇다면 어떻게?

이벤트 코드는 다음과 같습니다.

private void Explorer_MouseOverEvent(mshtml.IHTMLEventObj e)
{
      mshtml.IHTMLDocument2 doc = this.Explorer.Document as IHTMLDocument2;
      element = doc.elementFromPoint(e.clientX, e.clientY);
      if (element.tagName.Equals("DIV", StringComparison.InvariantCultureIgnoreCase))
      {
          element.style.border = "thin solid blue;";
          if (element.className != null)
          {
               UpdateToolstrip(element.className);
          }
      } 
      e.returnValue = false;
}

그리고 다음은 툴바의 스레드-안전 업데이트를 시도합니다.

delegate void UpdateToolstripDelegate(string text);

public void UpdateToolstrip(string text)
{
     if (this.toolStripLabel1.InvokeRequired == false)
     {
         this.toolStripLabel1.Text = text;
     }
     else
     {
         this.Invoke(new UpdateToolstripDelegate(UpdateToolstrip), new object[] { text });
     }
}

모든 제안은 대단히 감사합니다.

도움이 되었습니까?

해결책

문제를 실제로 재현 할 수는 없지만 (IE 도구 모음을위한 테스트 프로젝트를 만드는 것은 너무 많은 일입니다), 당신은 이것을 시도 할 수 있습니다.

공개 정적 (확장 메소드) 클래스에 다음 루틴을 추가하십시오.

public static void Invoke(this Control control, MethodInvoker methodInvoker)
{
    if (control.InvokeRequired)
        control.Invoke(methodInvoker);
    else
        methodInvoker();
}

그런 다음 첫 번째 블록의 유사한 코드 섹션을 다음과 같이 바꿉니다.

if (element.className != null)
{
    this.Invoke(() => toolStripLabel1.Text = element.className);
}

이것은 UI 애플리케이션에서 스레드 안전 문제를 피하는 확실한 방법입니다.

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