Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么一个代码路径立即将表单显示在顶部,而另一个不显示';T_C#_Multithreading_Castle Windsor - Fatal编程技术网

C# 为什么一个代码路径立即将表单显示在顶部,而另一个不显示';T

C# 为什么一个代码路径立即将表单显示在顶部,而另一个不显示';T,c#,multithreading,castle-windsor,C#,Multithreading,Castle Windsor,我正在维护一个C#.net程序,该程序使用Castle Windsor作为框架。它还使用Skincrafter来装饰形状 在它中,我们可以检测USB设备上是否存在文件,并生成另一个表单来处理它。当Windows引发USB事件或用户按下强制重新检查的按钮时,软件会检查文件 当用户强制重新检查时,如果找到文件,表单将显示在主表单的顶部,并由Skincrafter装饰。如果引发USB事件,则会生成表单,但表单不会显示在顶部(必须在任务栏中单击它才能看到),并且不会由Skincrafter装饰 两种检测

我正在维护一个C#.net程序,该程序使用Castle Windsor作为框架。它还使用Skincrafter来装饰形状

在它中,我们可以检测USB设备上是否存在文件,并生成另一个表单来处理它。当Windows引发USB事件或用户按下强制重新检查的按钮时,软件会检查文件

当用户强制重新检查时,如果找到文件,表单将显示在主表单的顶部,并由Skincrafter装饰。如果引发USB事件,则会生成表单,但表单不会显示在顶部(必须在任务栏中单击它才能看到),并且不会由Skincrafter装饰

两种检测文件的方法都达到了相同的功能,即告诉程序的另一部分生成表单来处理文件。我在调试时发现的唯一区别是,force recheck方法使用主线程,而USB Event方法有自己的子线程,该子线程通过显示的表单

是独立线程导致Windows无法在顶部生成窗体(可能被Skincrafter忽略),还是可能存在其他问题

如果需要,我可以发布代码,但是除了调用文件检查的方法之外,代码路径是相同的,并且数据是相同的

编辑-代码:

这是我制作的一个简单的重建。将System.Management添加到引用中的新WinForms项目。只需使用按钮制作一个表单(FormStartPosition设置为CenterScreen)并使用以下代码:

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,它适用于该示例,但不适用于我的实际程序。在我的程序中强制调用实际上并不调用委托代码,这很奇怪。