Castle Windsor를 프레임 워크로 사용하는 C# .net 프로그램을 유지 관리하고 있습니다. 또한 양식을 꾸미기 위해 Skincrafter를 사용합니다.한 코드 경로가 즉시 양식을 다른 페이지에 표시하는 이유는 무엇입니까?
우리는 USB 장치에서 파일의 존재를 감지하고이를 처리 할 수있는 다른 형식을 생성하는 기능을 가지고 있습니다. 소프트웨어는 Windows에서 USB 이벤트를 발생 시키거나 사용자가 재확인을 강제하는 버튼을 누를 때 파일을 검사합니다.
사용자가 재검사를 강요하면 파일이 발견되면 양식이 기본 양식 위에 나타나고 Skincrafter가 장식합니다. USB 이벤트가 발생하면 양식이 생성되지만 상단에 나타나지 않으며 (작업 표시 줄에서이를 클릭해야 볼 수 있음) Skincrafter가 장식하지 않습니다.
파일을 검색하는 두 가지 방법 모두 동일한 기능을합니다.이 기능은 프로그램의 다른 부분에 파일 처리 양식을 생성하도록 지시합니다. 디버깅 할 때 발견 한 유일한 차이점은 강제 재검사 방법은 주 스레드를 사용하는 반면 USB 이벤트 메서드는 표시되는 양식을 통과하는 자체 하위 스레드임을 확인하는 것입니다.
Windows가 양식을 생산하지 않게하는 별도의 스레드입니까? (아마도 Skincrafter에서 무시할 수 있습니다) 또는 다른 문제가 있습니까?
필자는 필요한 경우 코드를 게시 할 수 있지만 파일 경로를 호출하는 메소드 이외의 코드 경로는 동일하며 데이터는 동일합니다.
편집 - 코드 :
이것은 내가 만든 단순한 재구성입니다. System.Management가 포함 된 새로운 WinForms 프로젝트가 참조에 추가되었습니다. 그냥 버튼 형태 (CenterScreen로 설정 FormStartPosition를)하고이 코드를 사용합니다
public partial class Form1 : Form
{
private ManagementEventWatcher _eventWatcher = null;
int devices = 0;
public Form1()
{
InitializeComponent();
WqlEventQuery q = new WqlEventQuery();
q.EventClassName = "__InstanceOperationEvent";
q.WithinInterval = new TimeSpan(0, 0, 3);
q.Condition = @"TargetInstance ISA 'Win32_USBControllerDevice' ";
_eventWatcher = new ManagementEventWatcher(q);
_eventWatcher.EventArrived += new EventArrivedEventHandler(UsbEventArrived);
_eventWatcher.Start(); // Start listen for events
}
private void UsbEventArrived(object sender, EventArrivedEventArgs e)
{
if(System.Environment.GetLogicalDrives().Length - devices != 0) {
ShowThingy();
devices = System.Environment.GetLogicalDrives().Length;
}
}
private void button1_Click(object sender, EventArgs e)
{
ShowThingy();
}
private void ShowThingy()
{
Form form2 = new Form();
form2.Size = new Size(50, 50);
form2.StartPosition = FormStartPosition.CenterParent;
form2.TopMost = true;
form2.ShowDialog();
}
}
실행하고 USB 장치를 삽입하고 Form2를 양식은 기본 양식 뒤에 나타납니다.
이 때마다 문제가 다시 발생하지 않는 것 같습니다. 하지만 USB 장치를 처음 연결하면 처음에는 항상 두 번째 형식을 만드는 것처럼 보입니다. 버튼을 클릭 할 때마다 매번 두 번째 양식이 생성됩니다.
내가 윈도우 7
일부 코드를 게시하십시오. 그렇지 않으면 추측입니다. 또한 윈저가 어떻게 관련되는지 보지 못했습니다. 조금 더 설명해 주시겠습니까? –
끝에 코드를 첨부했습니다. Windsor가 스레드에 문제를 일으킬 수 있는지 여부를 알지 못하여 Windsor에 대해 언급 했으므로 관련 세부 사항이었습니다. – Septih
너무 많은 관련이없는 코드가있는 것처럼 보입니다 ... 독립 실행 형 테스트로 범위를 좁힐 수 있습니까? –