C# 为什么一个代码路径立即将表单显示在顶部,而另一个不显示';T
我正在维护一个C#.net程序,该程序使用Castle Windsor作为框架。它还使用Skincrafter来装饰形状 在它中,我们可以检测USB设备上是否存在文件,并生成另一个表单来处理它。当Windows引发USB事件或用户按下强制重新检查的按钮时,软件会检查文件 当用户强制重新检查时,如果找到文件,表单将显示在主表单的顶部,并由Skincrafter装饰。如果引发USB事件,则会生成表单,但表单不会显示在顶部(必须在任务栏中单击它才能看到),并且不会由Skincrafter装饰 两种检测文件的方法都达到了相同的功能,即告诉程序的另一部分生成表单来处理文件。我在调试时发现的唯一区别是,force recheck方法使用主线程,而USB Event方法有自己的子线程,该子线程通过显示的表单 是独立线程导致Windows无法在顶部生成窗体(可能被Skincrafter忽略),还是可能存在其他问题 如果需要,我可以发布代码,但是除了调用文件检查的方法之外,代码路径是相同的,并且数据是相同的 编辑-代码: 这是我制作的一个简单的重建。将System.Management添加到引用中的新WinForms项目。只需使用按钮制作一个表单(FormStartPosition设置为CenterScreen)并使用以下代码:C# 为什么一个代码路径立即将表单显示在顶部,而另一个不显示';T,c#,multithreading,castle-windsor,C#,Multithreading,Castle Windsor,我正在维护一个C#.net程序,该程序使用Castle Windsor作为框架。它还使用Skincrafter来装饰形状 在它中,我们可以检测USB设备上是否存在文件,并生成另一个表单来处理它。当Windows引发USB事件或用户按下强制重新检查的按钮时,软件会检查文件 当用户强制重新检查时,如果找到文件,表单将显示在主表单的顶部,并由Skincrafter装饰。如果引发USB事件,则会生成表单,但表单不会显示在顶部(必须在任务栏中单击它才能看到),并且不会由Skincrafter装饰 两种检测
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设备时,似乎总是在第一次之后创建第二种形式。每次单击按钮都会在顶部生成第二个窗体
我应该注意,我正在运行Windows 7。您没有设置模式窗口的所有者,默认设置为活动窗口(可能不是主窗口) 如果你使用了一个拥有者的重载,会发生什么
form2.ShowDialog(this);
如果这不起作用,它会发出强烈的线程问题的气味。能否尝试更改USB事件处理程序以在表单上使用?请发布一些代码,否则就是猜测。另外,我不明白温莎与此有什么关系,你能再解释一下吗?我已经把代码附在了末尾。我提到Windsor,因为我不知道这是否会导致线程出现问题,所以这是一个相关的细节。似乎有太多不相关的代码。。。你能把它缩小到一个独立的失败测试吗?创建了一个新项目来简化它。正如最后所指出的,它似乎只是第一次没能在顶部。使用ShowDialog(这)可以阻止对话框出现。我尝试过使用BeginInvoke,它适用于该示例,但不适用于我的实际程序。在我的程序中强制调用实际上并不调用委托代码,这很奇怪。