Я новичок в C # и событиях / делегатах.У меня есть тестовое приложение, которое я создал, которое имитирует то, что я пытаюсь сделать в более крупном проекте.Я продолжаю получать необработанное StackOverflowException при выполнении этого, и я вполне могу понять, почему.Я попытался изменить BeginInvok на Invoke, но, похоже, приложение полностью зависает.Разве я не настроил это правильно?
Вот код формы Windows:
public partial class Form1 : Form
{
delegate void AddProcessingEventItemCallback(string eventMessage);
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
TestClass t = new TestClass();
t.OnJobTaskStatusUpdate += new TestClass.JobTaskStatusUpdate(JobTaskStatusUpdateHandler);
Thread ts = new Thread(new ThreadStart(t.RunTest));
ts.Start();
ts.Join();
}
private void JobTaskStatusUpdateHandler(object sender, string statusMessage)
{
AddProcessingEventItem(statusMessage);
Application.DoEvents();
}
private void AddProcessingEventItem(string eventMessage)
{
if (this.listBox1.InvokeRequired)
{
AddProcessingEventItemCallback d = new AddProcessingEventItemCallback(AddProcessingEventItem);
this.BeginInvoke(d, new object[] { eventMessage });
}
else
{
listBox1.SelectedIndex = listBox1.Items.Add(eventMessage);
Application.DoEvents();
}
}
}
, а вот код в классе:
public class TestClass
{
public delegate void JobTaskStatusUpdate(object sender, string statusMessage);
public event JobTaskStatusUpdate OnJobTaskStatusUpdate;
public void RunTest()
{
for (int i = 1; i <= 500; i++)
{
UpdateJobTaskStatus(i.ToString(), true);
//System.Threading.Thread.Sleep(1000);
}
}
internal void UpdateJobTaskStatus(string statusMessage, bool addStatusTime)
{
UpdateJobTaskStatus(statusMessage, addStatusTime, false);
}
internal void UpdateJobTaskStatus(string statusMessage, bool addStatusTime, bool addLineSpacer)
{
OnJobTaskStatusUpdate(this, addStatusTime ? string.Format("{0} :\t{1}", DateTime.Now.ToString(), statusMessage) : string.Format("\t\t\t{0}", statusMessage));
if (addLineSpacer)
OnJobTaskStatusUpdate(this, "\t\t\t");
}
}
Iискал это некоторое время сейчас.Любая помощь будет принята с благодарностью.