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#从构造函数中调用事件_C#_Multithreading_Events_Constructor - Fatal编程技术网

C#从构造函数中调用事件

C#从构造函数中调用事件,c#,multithreading,events,constructor,C#,Multithreading,Events,Constructor,是否可以从C#中的构造函数内部调用/trigger/throw/fire(不知道正确的术语是什么)事件 我问这个问题的原因是我遇到了一个难题:我有一个表单需要很长时间才能启动(通过它的构造函数),因为它需要加载很多文件。因此,我希望在主窗体启动之前显示一个启动/加载屏幕。此外,我想用更新来更新启动屏幕,告诉它到目前为止加载了什么,没有加载什么 我在一个单独的线程中运行启动屏幕,并希望发送有关通过事件加载的内容的消息。不幸的是,我似乎无法从主窗体的构造函数中触发事件。有人对我能做什么有什么建议吗?

是否可以从C#中的构造函数内部调用/trigger/throw/fire(不知道正确的术语是什么)事件

我问这个问题的原因是我遇到了一个难题:我有一个表单需要很长时间才能启动(通过它的构造函数),因为它需要加载很多文件。因此,我希望在主窗体启动之前显示一个启动/加载屏幕。此外,我想用更新来更新启动屏幕,告诉它到目前为止加载了什么,没有加载什么

我在一个单独的线程中运行启动屏幕,并希望发送有关通过事件加载的内容的消息。不幸的是,我似乎无法从主窗体的构造函数中触发事件。有人对我能做什么有什么建议吗?或者如何从构造函数中触发事件


提前谢谢。

这个问题可能会对你有所帮助


它包含来自构造函数的事件调用过程

如果可以将参数传递给构造函数,则可以使用回调。比如:

public class MyClass
{
    public MyClass(Action<Progress> callback)
    {
        // Do work here...  
        callback(progress);
        // More work, etc.
    }
}
公共类MyClass
{
公共MyClass(操作回调)
{
//在这里工作。。。
回调(进度);
//更多的工作等。
}
}

如果您使用的是
winform
,请查看以下代码

public partial class Form1 : Form //Your initial form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        LaunchWorkForm();
    }
    private void LaunchWorkForm()
    {
        var form2 = new Form2();
        form2.OnStatusUpdated += form2_OnStatusUpdated;
        form2.ShowDialog();
    }

    private void form2_OnStatusUpdated(string status)
    {
        //message comes from Working Form
        //Invoke UI thread and update UI here
    }
}
现在,这是您的表单或对话框,有很多工作要做

public partial class Form2 : Form
{
    public delegate void UpdateStatusHandler(string status);
    public event UpdateStatusHandler OnStatusUpdated;
    public Form2()
    {
        //Start thread here
        if (OnStatusUpdated != null)
        {
            OnStatusUpdated("I am going to start work");
        }
        //Doing a lot of work here
        if (OnStatusUpdated != null)
        {
            OnStatusUpdated("Some of work has been done");
        }
        //Do other
        if (OnStatusUpdated != null)
        {
            OnStatusUpdated("Now I am ready to load the form");
        }
    }
}

您是否在winform WPF中工作?构造函数应该用于初始化类的状态。然后其他一切都出现了。在你的情况下,看起来你加载了不合适的逻辑。因此,将逻辑和事件放在单独的方法中,比如说
Init
。您正在处理什么类型的应用程序?WPF、Windows Phone等。。你试过异步加载文件吗?@jmaster18和X-TECH:我正在工作winform@user2636234当整个点都不需要时,为什么要从构造函数内部调用它?第二点不清楚。如果涉及WinForms,
控件
窗体
类中有很多事件。看见其他(WPF)类似。通常的事情。欢迎来到堆栈溢出!虽然这可以从理论上回答这个问题,但这里要包括答案的基本部分,并提供链接供参考。