当您实例化类并使用它们的方法启动线程correcT时,线程安全性并不那么重要?什么时候线程安全问题?
回答
如果多个线程访问相同的对象实例,那么你需要添加锁定以保证线程安全:
// make sure that this is defined *outside* the method
// so that all threads lock on the same instance
private readonly object _lock = new object();
...
// add a lock inside your event handler
proc.OutputDataReceived += (object sendingProcess, DataReceivedEventArgs e) =>
{
if (e.Data != null)
{
lock (_lock)
info.additional += e.Data;
}
};
作为一个侧面说明,如果你使用的是.NET 4,你可能要检查类ConcurrentQueue
。这是一个线程安全的实现FIFO缓冲器,如果多个线程需要同时排队的项目可以是有用的:
private ConcurrentQueue<SomeInfo> _queue = new ConcurrentQueue<SomeInfo>();
...
proc.OutputDataReceived += (object sendingProcess, DataReceivedEventArgs e) =>
{
if (e.Data != null)
{
// no need to lock
_queue.Enqueue(e.Data);
}
};
要在一个单独的线程出列的项目,你可以使用:
SomeData data = null;
while (_queue.TryDequeue(out data))
{
// do something with data
}
多个线程不访问同一个对象。创建一个启动每个线程进程的类的实例。 –
队列不是问题。这是我相信的输出重定向。 –
@Joey:将此添加到事件处理程序:'Console.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId);'。我相信你应该得到不同的线程ID写入控制台。 – Groo
- 1. 什么时候CopyOnWriteArraySet对实现线程安全的HashSet有用?
- 2. 这个Rack :: Protection :: FormToken是什么时候出现安全问题?
- 3. 线程安全问题
- 4. 线程安全NSMutableArray问题
- 5. 我的简单线程安全堆栈有什么问题?
- 6. 什么时候getter和setter与互斥体是线程安全的?
- 7. 什么时候UndecidableInstances安全?一些关于GHC扩展的一般问题
- 8. 守护线程什么时候有用?
- 9. 什么时候线程死在ThreadPoolExecutor中
- 10. 线程什么时候退出?
- 11. WCF相互SSL安全什么时候使用什么证书?
- 12. 线程池堆栈安全问题
- 13. NHibernate SessionFactory线程安全问题
- 14. StreamReader线程安全问题?可能?
- 15. C#:datatable线程安全问题
- 16. epoll是否有线程安全问题?
- 17. 线程安全访问数组和线程安全访问
- 18. msdn:什么是“线程安全”?
- 19. 线程安全是什么意思?
- 20. 为什么这个线程安全?
- 21. 什么是线程安全的ByteArrayOutputStream?
- 22. 线程安全是什么意思?
- 23. 什么是线程安全的对象
- 24. 插入时使用ConcurrentHashMap时线程安全问题
- 25. JSF的安全性问题是什么?
- 26. 散居的安全问题是什么?
- 27. 为什么suhosin.executor.allow_symlink存在安全问题?
- 28. 什么时候使用哪种方式访问UI线程?
- 29. 线程安全问题,同时超时为每个包的线程
- 30. 多线程:什么时候开始和退出线程
什么信息的类型是什么? –
请参阅编辑。 –
不知道这是否会有所帮助,但检查出我在这里发布的答案:http://stackoverflow.com/questions/5187568/delays-when-reading-process-output-asynchronously/5187715#5187715 –