了解线程/BeginInvoke? [初学者]
考虑代码:
class Work
{
public void DoStuff(string s)
{
Console.WriteLine(s);
// .. whatever
}
}
class Master
{
private readonly Work work = new Work();
public void Execute()
{
string hello = "hello";
// (1) is this an ugly hack ?
var thread1 = new Thread(new ParameterizedThreadStart(o => this.work.DoStuff((string)o)));
thread1.Start(hello);
thread1.Join();
// (2) is this similar to the one above?
new Action<string>(s => this.work.DoStuff(s)).BeginInvoke(hello, null, null);
}
}
(1) 是在单独线程中轻松启动某些工作的可接受的方法吗?如果没有更好的选择,将不胜感激。
(2) 做同样的事情吗?我想我问的是是否启动了一个新线程,或者..
希望你可以帮助初学者更好地理解:)
/Moberg
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
(1) 并不是一个丑陋的黑客,但它不是现在处理线程的“最”方式。 线程池线程通过
BeginInvoke/EndInvoke
,BackgroundWorker
和 .NET 4.0 中的任务并行库 是最佳选择。(2) 很好,但您需要将
BeginInvoke
与EndInvoke
某处配对。将新的Action
分配给一个变量,然后在主线程或完成方法中手动调用x.EndInvoke()
(的第二个参数>开始调用
)。请参阅此处作为不错的参考。编辑: (2) 应该看起来与 (1) 相当:
(1) is not an ugly hack, but it is not "the" way of doing threads these days. Thread Pool threads via
BeginInvoke/EndInvoke
,BackgroundWorker
and the Task Parallel Library in .NET 4.0 are the way to go.(2) is good, BUT you need to pair your
BeginInvoke
with anEndInvoke
somewhere. Assign the newAction<string>
to a variable and then callx.EndInvoke()
manually on it in your main thread or in a completion method (2nd parameter toBeginInvoke
). See here as a decent reference.Edit: here's how (2) should look to be reasonably equivalent to (1):