【发布时间】:2012-01-27 14:35:19
【问题描述】:
我认为这是一个愚蠢的问题,但发现我无法做到以下几点让我有点奇怪:
EditingItem.FROM = EditingItem.TO = DateTime.Now; // FROM, TO are DateTime
在此操作之后,程序有时会挂起,但有时它会按我认为的那样工作。
这是一个例外:
检测到 ContextSwitchDeadlock 消息:CLR 无法 从 COM 上下文 0x478b80 转换到 COM 上下文 0x478dd0 为 60 秒。拥有目标上下文/公寓的线程是 很可能要么进行非抽水等待,要么处理很长时间 在不发送 Windows 消息的情况下运行操作。这个情况 通常会对性能产生负面影响,甚至可能导致 应用程序变得无响应或内存使用量累积 随着时间的推移不断。为了避免这个问题,所有的单线程 公寓 (STA) 线程应使用泵送等待原语(例如 CoWaitForMultipleHandles)并在长时间内定期发送消息 运行操作。
将代码改为:
EditingItem.FROM = DateTime.Now;
EditingItem.TO = DateTime.Now;
对我的情况有帮助。
无法正确谷歌问题,看解释,所以你能帮忙解释一下为什么 whis 表达是错误的吗?
PS 在 cmets 中进行更多讨论。
以下是一些实验结果:
DateTime d = DateTime.Now;
EditingItem.FROM = EditingItem.TO = d;//hang
添加了计时循环:
for (int i = 0; i < 100000; i++)
{
i++;
}
DateTime d = DateTime.Now;
EditingItem.FROM = EditingItem.TO = d;//hang
【问题讨论】:
-
与日期时间无关。如果它挂起,则会发生一些问题中未提供的线程同步。
-
@Aliostad,认为你是对的。我添加了例外。但如果它与线程有关——为什么它总是挂在这条线上?
-
您能解释一下 COM 与
DateTime问题的关系吗?EditingItem的类型是什么? -
@MartinLiversage,EditingItem 是一些数据库类型,由实体框架提供者生成。我没有在我的代码中使用 COM。我确实使用了 DevExpress 组件(WPF),并且这个初始化发生在我刷新他们的网格之后。可能他们的网格有问题,但对我来说有趣的部分是为什么它挂在这条线上以及为什么初始化分离有帮助??
-
@0x49D1:要解决此问题,请确定涉及的两个线程。一个是用户界面线程,该线程以某种方式被阻塞。另一个后台线程正在尝试访问您的 COM 对象(很可能是 DevExpress 组件),而用户界面线程被阻止。可能还有其他情况,但这是一个可能的候选者。我仍然看不到与
DateTime事物的联系。也许这只是触发您的问题的随机时间问题。DateTime.Now有点“慢”,所以引入另一个呼叫会增加一点延迟。
标签: c# datetime declaration