【问题标题】:C# Calling events from within the constructorC# 从构造函数中调用事件
【发布时间】:2015-08-21 12:32:32
【问题描述】:

是否可以从 C# 的构造函数内部调用/触发/抛出/触发(不知道正确术语是什么)事件?

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

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

提前致谢。

【问题讨论】:

  • 你在winform,WPF中工作吗?
  • 构造函数应该用于初始化类的状态。然后出现其他一切。在您的情况下,您似乎使用不适当的逻辑加载它。所以把逻辑和事件放到单独的方法中,比如Init
  • 您正在开发什么类型的应用程序? WPF、Windows Phone 等。您是否尝试过异步加载文件?
  • @jmaster18 和 X-TECH:我在 winform 工作
  • @user2636234 为什么要从构造函数中调用它,而不是整个指向?第二点不清楚。如果涉及 WinForms,ControlForm 类中有很多事件。见here。其他(WPF)类似。平常的事。

标签: c# multithreading events constructor


【解决方案1】:

这个问题可能对你有帮助

C# constructor event

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

【讨论】:

  • 欢迎来到 Stack Overflow!虽然这在理论上可以回答这个问题,it would be preferable 在这里包括答案的基本部分,并提供参考链接。
【解决方案2】:

如果您使用的是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");
        }
    }
}

【讨论】:

    【解决方案3】:

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

    public class MyClass
    {
        public MyClass(Action<Progress> callback)
        {
            // Do work here...  
            callback(progress);
            // More work, etc.
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-17
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      相关资源
      最近更新 更多