Я ищу решение для interthread общения. Тема А является основной нитью приложения Windows. Я запускаю Thread B, который работает независимо от потока a, они не используют код. Но нить A должна получить некоторую обратную связь о состоянии потока b. Я пытаюсь решить это с помощью делегата. Мне очень жаль, что я забыл добавить, что я должен работать на .NET 3.5, C#, WEC7Связь между потоками через делегатов?
Важно, что код
public void OnMyEvent(string foo)
{
MessageBox.Show(foo);
}
выполняется в контексте потока а, как может Я достигнуть этого
public partial class Form1 : Form
{
//...
public void StartThread(Object obj)
{
new ClassForSecondThread(obj as Parameters);
}
private void button1_Click(object sender, EventArgs e)
{
//ParameterizedThreadStart threadstart = new ParameterizedThreadStart(startThread);
ParameterizedThreadStart threadstart = new ParameterizedThreadStart(StartThread);
Thread thread = new Thread(threadstart);
Parameters parameters = new Parameters(){MyEventHandler = OnMyEvent};
thread.Start(parameters);
}
public void OnMyEvent(string foo)
{
MessageBox.Show(foo);
}
}
//This code is executed in Thread B
public class ClassForSecondThread
{
public ClassForSecondThread(Parameters parameters)
{
if (parameters == null)
return;
MyEventhandler += parameters.MyEventHandler;
DoWork();
}
private void DoWork()
{
//DoSomething
if (MyEventhandler != null)
MyEventhandler.DynamicInvoke("Hello World");// I think this should be executed async, in Thread A
Thread.Sleep(10000);
if (MyEventhandler != null)
MyEventhandler.DynamicInvoke("Hello World again"); // I think this should be executed async, in Thread A
}
public event MyEventHandler MyEventhandler;
}
public class Parameters
{
public MyEventHandler MyEventHandler;
}
public delegate void MyEventHandler(string foo);
Ваш пример кода очень важен для реальной проблемы с таким подходом. Ничего не происходит в течение 10 секунд, поэтому пользователь сдался и закрыл окно. Это не закончится хорошо. –
Перейдите к параллельной библиотеке задач http://msdn.microsoft.com/en-us/library/dd460717.aspx –
@ Ханс Пассант: но есть возможность для Главного потока знать, есть еще один поток работает, не так ли? На следующем шаге важно, чтобы иметь возможность вызывать код в потоке b два, чтобы остановить поток внешнего устройства и остановить себя – traveller