首页 新闻 会员 周边 捐助

引发类型为“System.OutOfMemoryException”的异常。

0
[已解决问题] 解决于 2016-12-16 18:03

报错信息:

位于 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()

琴声的主页 琴声 | 初学一级 | 园豆:147
提问于:2016-11-18 17:57
< >
分享
最佳答案
0

Queue<T>换成ConcurrentQueue<T>

4.0前对q加lock

 

队列里面堆了多少玩意?你没dequeue么?

奖励园豆:5
Daniel Cai | 专家六级 |园豆:10424 | 2016-11-18 17:57

我没用队列,我创建了一个线程,

琴声 | 园豆:147 (初学一级) | 2016-11-18 18:00

这个是错误代码:

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();
琴声 | 园豆:147 (初学一级) | 2016-11-18 18:02

@琴声: 为毛要while(true)?不能等前面完成了再做下一次么?

Daniel Cai | 园豆:10424 (专家六级) | 2016-11-18 18:04

在执行 BoCo.Jiangxi.Kpip.SysManager.日报发布.Page日报发布主页 BJKS日Page = new BoCo.Jiangxi.Kpip.SysManager.日报发布.Page日报发布主页();报的错

琴声 | 园豆:147 (初学一级) | 2016-11-18 18:04

@Daniel Cai: 因为我要不停的去调用里面的方法

琴声 | 园豆:147 (初学一级) | 2016-11-18 18:05

@琴声: 你代码明明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 | 园豆:10424 (专家六级) | 2016-11-18 18:11

@Daniel Cai: 你这个代码会爆出跨线程调用的错误,我试过了,,

琴声 | 园豆:147 (初学一级) | 2016-11-18 18:15

我不用while(true) 代码就不会循环被调用啊,,

琴声 | 园豆:147 (初学一级) | 2016-11-18 18:16

@琴声: 两种方案,1,显式设定CheckForIllegalCrossThreadCalls为false试下(winform不太熟,不太确定是否可行)

2.使用SendOrPostCallback来处理ui线程和后台线程的交互。

Daniel Cai | 园豆:10424 (专家六级) | 2016-11-18 18:21

@Daniel Cai: 

哦,但是我不是使用winform 而是 silverlight,,

琴声 | 园豆:147 (初学一级) | 2016-11-18 18:23

@琴声: 更没接触过sliverlight,不过理论还是类似的。如果你只治表的话,把while(true)的条件换成里面那个if条件,然后在每个周期结束后sleep一下。

Daniel Cai | 园豆:10424 (专家六级) | 2016-11-18 18:26

@Daniel Cai:这样的话就只能执行一次了,,

琴声 | 园豆:147 (初学一级) | 2016-11-18 23:53

@琴声: sorry,while true里面写此条件

while(true)

{

  if(condition)

   {

  ..//

   }

 Thread.Sleep(1000);

}

Daniel Cai | 园豆:10424 (专家六级) | 2016-11-19 09:35

@Daniel Cai: condition是什么?

琴声 | 园豆:147 (初学一级) | 2016-11-20 16:40

@琴声: 你的条件啊。

Daniel Cai | 园豆:10424 (专家六级) | 2016-11-20 17:13

@Daniel Cai: 

能不能把代码贴个我看看?

琴声 | 园豆:147 (初学一级) | 2016-11-21 09:16

假如if代码块中也需要用时间去控制代码的执行,那么ui线程是否就阻塞了。

琴声 | 园豆:147 (初学一级) | 2016-11-21 09:18

@琴声: 

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 | 园豆:10424 (专家六级) | 2016-11-21 09:50

@Daniel Cai: 好了,谢谢,,

琴声 | 园豆:147 (初学一级) | 2016-11-22 14:34
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册