我不喜欢这段代码,但我总是对线程感到困惑,所以在我建议改变之前需要别人的输入;这个线程是否安全(Psuedo代码虽然基于C#):
class ThreadCreator
{
private AnObject obj = new AnObject();
public ThreadCreator()
{
for (int i = 0; i < 100; ++i)
{
ThingToThread th = new ThingToThread();//don't care about losing ref to th for this question
th.sendMsg = this.getMessage;
Thread t = new Thread(th.doThing);
t.SetApartmentState(ApartmentState.STA);
t.Start();
}
}
public void getMessage( string stuff )
{
...
obj.DoThing(stuff);
...
}
}
class ThingToThread
{
public delegate void sendMsg(string stuff);
public void doThing()
{
...
this.sendMsg("ohh that's interesting");
...
}
}
答案 0 :(得分:4)
你没有回复任何其他线程。
您的代码将在新线程上执行委托,就像任何其他函数调用一样。
如果getMessage
不是线程安全的,那么您的代码就会中断。
答案 1 :(得分:0)
你的例子不是线程安全的,如果你想要线程安全我会非常建议使用BackgroundWorker在新线程中执行,但是将消息发送回主线程。
例如:
class ThreadCreator
{
private AnObject obj = new AnObject();
public ThreadCreator()
{
for (int i = 0; i < 100; ++i)
{
ThingToThread th = new ThingToThread();
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += th.DoWork;
worker.ProgressChanged += WorkerProgressChanged;
worker.RunWorkerAsync();
}
}
private void WorkerProgressChanged(object sender, ProgressChangedEventArgs e)
{
string stuff = e.UserState as string;
obj.DoThing(stuff);
}
}
你的ThingToThread DoWork方法看起来像:
public void DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
worker.ReportProgress(50, "Half way there");
worker.ReportProgress(100, "Finished");
}