我有一个Queue对象,我需要确保它是线程安全的.使用这样的锁对象会更好吗:
lock(myLockObject)
{
//do stuff with the queue
}
Run Code Online (Sandbox Code Playgroud)
或者是否建议像这样使用Queue.Synchronized:
Queue.Synchronized(myQueue).whatever_i_want_to_do();
Run Code Online (Sandbox Code Playgroud)
从阅读MSDN文档开始,我说我应该使用Queue.Synchronized来使它成为线程安全的,但是它给出了一个使用锁对象的例子.来自MSDN文章:
为了保证Queue的线程安全,所有操作必须仅通过此包装器完成.
枚举通过集合本质上不是线程安全的过程.即使集合是同步的,其他线程仍然可以修改集合,这会导致枚举器抛出异常.为了在枚举期间保证线程安全,您可以在整个枚举期间锁定集合,也可以捕获由其他线程所做的更改导致的异常.
如果调用Synchronized()不能确保线程安全有什么意义呢?我在这里错过了什么吗?
在Win32编程中,窗口的父窗口和窗口的所有者之间有什么区别?我以为我弄清楚了,然后我遇到了这段代码:
SetWindowLong(handle, GWL_HWNDPARENT, foo);
Run Code Online (Sandbox Code Playgroud)
这实际上设置了窗口的所有者,而不是父级 - 尽管使用了GWL_HWNDPARENT.父母/所有者这些术语是否可以互换,或者实际上是否存在差异?
我希望我能够清楚地解释清楚.我有我的主表单(A),它使用form.Show()打开1个子表单(B),使用form.Show()打开第二个子表单(C).现在我希望子窗体B使用form.ShowDialog()打开一个窗体(D).当我这样做时,它会阻止形式A和C形式.有没有办法打开一个模态对话框,只有它阻止打开它的表单?
我正在寻找新的液晶显示器,但我担心光滑的显示器可能会在一整天的工作后造成更多的眼睛疲劳.我通常会在显示器前花很多时间,所以眼睛疲劳肯定是我想到的.您更喜欢哑光或有光泽的LCD屏幕吗?为什么?
如果我在C#中这样做:
Console.WriteLine(DateTime.Now.ToString("ddd M/dd/yy"));
Run Code Online (Sandbox Code Playgroud)
我希望输出像这样:
Wed 6/15/11
Run Code Online (Sandbox Code Playgroud)
但它确实输出了这个:
Wed 6 15 11
Run Code Online (Sandbox Code Playgroud)
为什么斜线消失了?有没有办法防止这种情况,并以预期的格式输出日期?
我知道大多数人都建议使用HttpRuntime.Cache,因为它具有更大的灵活性......等等.但是如果你希望对象在应用程序的生命周期中保留在缓存中呢?使用Application []对象缓存内容有什么大的缺点吗?
我有一个包含一些DLL的文件夹(不是.NET程序集),我想读取它们中的文件信息.像版本,名称......等等.最好的方法是什么?
.NET WinForms中的Control和UserControl有什么区别?我想创建一个自定义控件,但我应该继承哪一个?我过去总是使用Control而没有任何问题,但这是创建自定义控件的"推荐"方式吗?
我有我的主GUI线程,第二个线程在它自己的ApplicationContext中运行(以保持它活着,即使没有工作要做).我想从我的GUI线程调用我的第二个线程上的方法,但是如果我只是调用thread.Method(); 它似乎在我的主GUI线程上运行并导致我的GUI无响应.在不同线程上调用方法的最佳方法是什么?
更新: 我真正想要做的是在两个线程之间进行通信,而不是与GUI通信.GUI恰好是需要与我的第二个线程进行通信的线程之一.
更新#2: 好的,我一定是错过了什么.我创建了一个事件和一个委托,并让我的工作线程订阅了该事件.但是当我调用Invoke(MyEvent)时; 从我的GUI线程中,工作线程最终在GUI线程上工作并挂起GUI线程直到它完成处理.在没有轮询静态对象的情况下,我正在尝试做什么?
我很难跟踪锁定问题,所以我想记录每个方法调用的进入和退出.我以前用C++完成了这个,而不必为每个方法添加代码.这可能与C#有关吗?