타사 소프트웨어 용 플러그인을 만들고 있습니다. 플러그인은 리본 버튼과 Winform으로 구성됩니다. 리본에서 SW와 상호 작용하는 데 문제가 없습니다. 문제는 WinForm을 별도의 스레드에서 시작해야하므로 발생합니다. 왜? 그 아래의 UI에 대한 액세스를 차단하지 않고 최상단에 유지하기.크로스 스레드 업데이트 UI 문제
var thread = new System.Threading.Thread(() => {
var sc= new SetCategory();
sc.ShowDialog();
});
thread.Start();
그런 다음, 그 "SetCategory"형태의 버튼에 의해 트리거, 내가 플러그인을 호스팅하는 소프트웨어에 액세스하고 값을 설정해야합니다
는이 같은 (이름 SetCategory) 폼을 실행하십시오. 이 같은 그것을 시도 :
SendOrPostCallback updateSegment = delegate(object state)
{
theApplication.theProprietaryControl = myValue
};
System.Threading.SynchronizationContext.Current.Post(updateSegment, null);
참고 :이 무관하다 나는 전체 응용 프로그램 제어 오두막을 포함하지 않았습니다. UI 스레드에서 Form을 시작한 후 나중에 닫아서 사용자가 응용 프로그램에서 계속 작업 할 수 있으면 모든 것이 올바르게 작동하므로 해당 동작 자체에는 아무런 문제가 없습니다.
나는 또한MethodInvoker
및
BeginInvoke
를 사용하여 시도했지만 결과는 두 경우 모두에이기는하지만 동일 매우 이상한 일 :
동작이 수행> ==, 나는 나의 값이 설정되는 것을 볼 수 있습니다 - 아직
이 메소드/속성은 UI 스레드에서 호출해야합니다. 컨트롤의 InvokeRequired 속성을 테스트하고 을 수정하고 InvokeRequired가 true 일 때 을 직접 호출하는 대신 Invoke() 또는 BeginInvoke()를 호출하십시오.
내가 Continue
으로 선택하면 계속 진행할 수 있으며 모든 것이 정상적으로 작동 한 것처럼 값이 설정됩니다. 할 수있는, 내가 작업이 올바른 스레드에서 실행되어 있는지 확인하기 위해 ThreadID을 사용할 수 없습니다
var uid = Thread.CurrentThread.ManagedThreadId;
var thread = new System.Threading.Thread(() => {
var sc= new SetCategory();
sc.Controls["lblUiThreadId"].Text = uid.ToString();
sc.ShowDialog();
});
thread.Start();
아아 :
나는 버튼에서 양식을 실행하기 전에이 같은 UI 스레드의 ThreadId을 전달 시도 나는?
감사합니다.
AFAIK 만드는 윈폼 비 UI 스레드의 컨트롤은 일반적으로 큰 "Nono"입니다. 따라서 앱 당 UI 스레드가 두 개 이상 있습니다. (https://support.microsoft.com/en-us/kb/943139) – user6144226
한 가지를 이해하지 못합니다. 필요한 것이 있다면 _modal_ 대화 상자가없는 것입니다. 그렇다면 왜 안되나요? 'sc.ShowDialog()'대신에'sc.Show()'를 사용하고 _main_ 쓰레드에 살게 하시겠습니까? –
@AdrianoRepetti 왜냐하면 나는 바보입니다. : -} 이전의 시도에서 나는 아래의 응용 프로그램을 클릭하면 양식이 다시 사라질 것으로 예상했습니다. 넌 모달 플러스 맨 위가 가장 잘 작동합니다. 귀찮게해서 미안해. – LocEngineer