报错信息:
位于 System.Collections.Generic.Queue`1.SetCapacity(Int32 capacity)
位于 System.Collections.Generic.Queue`1.Enqueue(T item)
位于 System.Windows.Threading.Dispatcher.BeginInvokeImpl(DispatcherPriority priority, Boolean useFastPath, Delegate d, Object[] args)
位于 System.Windows.Threading.Dispatcher.BeginInvoke(Action a)
位于 BoCo.Jiangxi.Kpip.SysManager.App.<>c__DisplayClass2.<Application_Startup>b__0()
位于 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
位于 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
位于 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
位于 System.Threading.ThreadHelper.ThreadStart()
Queue<T>换成ConcurrentQueue<T>
4.0前对q加lock
队列里面堆了多少玩意?你没dequeue么?
我没用队列,我创建了一个线程,
这个是错误代码:
DateTime intime = DateTime.Now; System.Threading.SynchronizationContext sc = System.Threading.SynchronizationContext.Current; Thread logThread = new Thread(() => { while (true) { Deployment.Current.Dispatcher.BeginInvoke(() => { TimeSpan ts = DateTime.Now - intime; if (ts.TotalMinutes > 1) { BoCo.Jiangxi.Kpip.SysManager.日报发布.Page日报发布主页 BJKS日Page = new BoCo.Jiangxi.Kpip.SysManager.日报发布.Page日报发布主页(); BJKS日Page.TurnMsg(); intime = DateTime.Now; } }); } }); logThread.IsBackground = true; logThread.Start();
@琴声: 为毛要while(true)?不能等前面完成了再做下一次么?
在执行 BoCo.Jiangxi.Kpip.SysManager.日报发布.Page日报发布主页 BJKS日Page = new BoCo.Jiangxi.Kpip.SysManager.日报发布.Page日报发布主页();报的错
@Daniel Cai: 因为我要不停的去调用里面的方法
@琴声: 你代码明明1分钟走一把就可以了。你这while(true)是不是有点过了?
var td=new Thread(_=>{
var dt=DateTime.Now;
while((DateTime.Now-dt).TotalMinutes>1)
{
BoCo.Jiangxi.Kpip.SysManager.日报发布.Page日报发布主页 BJKS日Page = new BoCo.Jiangxi.Kpip.SysManager.日报发布.Page日报发布主页(); BJKS日Page.TurnMsg();
dt=DateTime.Now;
Thread.Sleep(1);
}
});
@Daniel Cai: 你这个代码会爆出跨线程调用的错误,我试过了,,
我不用while(true) 代码就不会循环被调用啊,,
@琴声: 两种方案,1,显式设定CheckForIllegalCrossThreadCalls为false试下(winform不太熟,不太确定是否可行)
2.使用SendOrPostCallback来处理ui线程和后台线程的交互。
@Daniel Cai:
哦,但是我不是使用winform 而是 silverlight,,
@琴声: 更没接触过sliverlight,不过理论还是类似的。如果你只治表的话,把while(true)的条件换成里面那个if条件,然后在每个周期结束后sleep一下。
@Daniel Cai:这样的话就只能执行一次了,,
@琴声: sorry,while true里面写此条件
while(true)
{
if(condition)
{
..//
}
Thread.Sleep(1000);
}
@Daniel Cai: condition是什么?
@琴声: 你的条件啊。
@Daniel Cai:
能不能把代码贴个我看看?
假如if代码块中也需要用时间去控制代码的执行,那么ui线程是否就阻塞了。
@琴声:
var dt=DateTime.Now;
var td=new Thread(_=>{
while(true)
{
if((DateTime.Now-dt).TotalMinutes>1)
{
//..your job here
}
Thread.Sleep(60*1000);
}
});
td.Start();
@Daniel Cai: 好了,谢谢,,