做一个跨线程调用隐藏窗体的Visual C#(making a cross-thread call

2019-11-04 05:19发布

更新:由于解决方案来了,现在被接受。 由于伪代码,在这个问题上的明确性的解决只用了几秒钟。 试图找出与其他解决方案看似“重复”的问题花了很多时间了。 我在的那一刻起20分钟我问这个问题的解决方案。 因此,这不是一个重复的,可能是最清楚他们的所有的更新。

虽然一些类似的问题已经被问过这个问题,我仍然没有能够从他们放在一起工作代码。 我的主要应用是不是一个形式,而是在一个单独的类,它是一个插件,由主机应用程序执行。

因此,尽管它似乎是一个重复的问题,事实并非如此。 请往下看。

我有我的主类做的东西。 然后,我有一个显示信息给用户的形式。 我需要当用户从应用程序切换去,免得这种形式(主机应用程序失去焦点)。

我使用非常有限的API,以便在主机应用程序触发了我处置事件的唯一方法,我有。

我创建了一个触发用户每100ms,并检查是否有针对的应用一个定时器。 如果不是有命令发送到窗体隐藏自身。

这样做的原因的做法是因为主机的应用程序失去焦点只是我需要隐藏的形式很多场景之一,我需要通过同一个确切的方法来引导这些。

所有的类的其余部分(该范围内的作品Hide()方法是从应用程序没有问题的其余部分调用。但是,当计时器调用它不起作用Hide()方法,因为计时器是在不同的线程时它闪光。因此,呼叫变成一个跨线程调用。

非常具体的问题是,我需要一个确切的示例代码如何从计时器事件处理程序此调用形式的Hide()方法线程安全的Invoke

谢谢。

这是定时器:

private void Controllel_Opened(object sender, EventArgs e)
{
    myTimer.Elapsed += new System.Timers.ElapsedEventHandler(DisplayTimeEvent);
    myTimer.Interval = 50;
    myTimer.Start();
}

public static System.Timers.Timer myTimer = new System.Timers.Timer();
// This method checks different scenarios when the tool tip should be hidden and calls the hiding method
public static void DisplayTimeEvent(object source, System.Timers.ElapsedEventArgs e)
{
    FormHandler.Hide();
}

那么“FormHandler”类:

public static class FormHandler
{
    private static Form1 frm1 = new Form1();

    public delegate void Form1HideEventHandler();
    public static event Form1HideEventHandler Form1Hide;

    public static void Hide()
    {
        if (Form1Hide != null)
        {
            Form1Hide();
        }

    }
}

然后表单的代码:

public partial class Form1 : Form
{   
    public Form1()
    {
        InitializeComponent();
        FormHandler.Form1Hide += FormHandler_Form1Hide;
    }

    private void FormHandler_Form1Hide()
    {
        Hide();
    }
}

我想获得与精确的代码,如果可能的解决方案。 谢谢。

Answer 1:

private void FormHandler_Form1Hide()
{
    if (InvokeRequired)
    {
        this.Invoke(new Action(() => { FormHandler_Form1Hide(); }));
    }
    else
    {
        Hide();
    }
}


Answer 2:

您需要使用System.Windows.Forms.Timer代替。 这将调用返回到调度线程。



文章来源: making a cross-thread call to hide a form visual c#