2015-08-21 4 views
2

Возможно ли вызвать вызов/триггер/бросок/огонь (не знаю, что такое правильный термин) события изнутри конструктора в C#?C# Вызов событий изнутри конструктора

Причина, по которой я прошу, состоит в том, что у меня есть дилемма: у меня есть форма, которая занимает очень много времени, чтобы начать (пройдите через его конструктор), потому что ему нужно загрузить много файлов. Итак, я хочу, чтобы экран всплеска/загрузки появлялся до тех пор, пока не будет начата основная форма. Более того, я хочу обновить заставку обновлениями, сообщающими, что загружено до сих пор, а что нет.

Я запускаю заставку в отдельном потоке и хочу отправлять сообщения о том, что загружено через события. К сожалению, кажется, что я не могу запускать события из конструктора основной формы. У кого-нибудь есть предложения относительно того, что я могу сделать? Или как я буду запускать события из конструктора?

Заранее спасибо.

+0

Вы работаете в winform, WPF? –

+3

Конструктор должен быть для инициализации состояния класса. Затем появляется все остальное. И в вашем случае похоже, что вы загружаете его с неправильной логикой. Поэтому поместите логику и события в отдельный метод, например 'Init'. – Artyom

+0

В каком виде вы работаете? WPF, Windows Phone и т. Д. Вы пытались загрузить файлы асинхронно? – dimlucas

ответ

0

Если вы используете 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"); 
     } 
    } 
} 
1

Этот вопрос может помочь вам

C# constructor event

Он содержит событие призывающую процедуру из конструктора

+4

Добро пожаловать в переполнение стека! Хотя это теоретически может ответить на вопрос, [было бы желательно] (// meta.stackoverflow.com/q/8259) включить сюда основные части ответа и предоставить ссылку для справки. – ryanyuyu

0

Если вы можете передать в качестве аргументов конструктора, то вы можете использовать функцию обратного вызова. Что-то вроде:

public class MyClass 
{ 
    public MyClass(Action<Progress> callback) 
    { 
     // Do work here... 
     callback(progress); 
     // More work, etc. 
    } 
} 
Смежные вопросы