C#winform中的多线程问题

做了一个雷达显示程序,窗口线程按坐标绘制目标点,有一个后台线程更新目标的坐标。
运行起来发现过一会显示线程出现拖慢的想想,有卡顿。后来我把后台线程的处理函数改成一个
只有while(true);的死循环不做任何运算,运行一段时间后还是出现卡顿现象。这是怎么回事?

6个回答

两个可能性,一个是你的点太多,或者持续增多,导致内存溢出。
一个是你没有正确同步或者滥用同步,造成不必要的上锁。
不知道你是怎么绘制的坐标点,是否启用了双缓冲,启用双缓冲可以提高性能。
用vs带的性能检测工具看下,你的卡顿,执行时间消耗在计算坐标上还是更新绘图上。

caozhy
贵阳老马马善福专门编写代码的老马就是我! 回复sinat_36035248: 没有代码不好说
一年多之前 回复
sinat_36035248
sinat_36035248 至于上锁倒是有可能,但是我只lock了两个地方,至两个地方不Lock会出错,我测试过
一年多之前 回复
sinat_36035248
sinat_36035248 我是用direct2d画的图像,所以我感觉可能不是双缓冲的问题。我用工具检测没存没有发现明显的增加,就是GC偶尔会回收一下,也就回收1M左右,会是这个问题吗
一年多之前 回复

首先,确认你线程更新界面UI是不卡顿的,确认线程不会使用lock等方式阻塞主进程
其次,创建线程的时候指定BACKGROUND是true
最后,确认一下,线程创建的大内存资源有及时并有效释放,其他的应该没问题

采用异步编程模式,应该可以解决问题

happytzj
若鱼happy 回复sinat_36035248: 参考一下 https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/concepts/async/
一年多之前 回复
sinat_36035248
sinat_36035248 求教什么是异步变成模式
一年多之前 回复
参考一下 https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/concepts/async/ 

采用异步编程模式,再试一试

查看下内存占用的情况,是不是内存泄漏导致!!!!

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C#winform多线程问题
有一个委托A,跟踪显示一个方法B的执行进度,方法B是引用的C++的dll,在委托A的方法中有进度参数,无法放到界面显示。方法B是有ref值标记是否执行完毕的,方法B要根据界面选择个数多次执行。要如何实现呢?nn我是用while循环检测方法B是否执行完,执行完就执行下一次,但是委托A只能得到进度,无法更新到界面显示。n如果把while去掉,执行一次B没问题。用system.timer获取进度待while结束才显示在页面全部数据,用刷新也没用
c#winform多线程
在一个窗口上加载了几个自定义控件,打开这个窗口时出现短暂白屏(卡死似的),为了解决这个问题,我用了多线程,但没有效果.不知道问题出在哪,下面是代码,麻烦给看一下,多谢.rnprivate void FormMain_Load(object sender, System.EventArgs e)rn add_cotrol1();//多线程rn add_cotrol2();//多线程rnrn private void add_cotrol2()rn rn Thread thread = new Thread(new ThreadStart(StartSomeWorkFromUIThread2));rn thread.IsBackground = true;rn thread.Start();rn rn private void StartSomeWorkFromUIThread2()rn rn if (this.InvokeRequired)rn rn BeginInvoke(new EventHandler(RunsOnWorkerThread2), null);rn rn elsern rn RunsOnWorkerThread2(this, null);rn rn rn private void RunsOnWorkerThread2(object sender, EventArgs e)rn rn //加载控件rn .......我的代码.rn rn
c#winform UI多线程显示问题
想用子线程控制窗体中一个panel的显示,panel中有一个滚动条,看代码rn[code=C#]rnThread th = new Thread(new ThreadStart(ThreadProcess));rnth.Start();rnstring serverdata = FileService.GetQueryData(UserName, PassWord, "上传日期", true, condition, folderKey, pagesize, 1, out toNum, out ds);rn[/code]rn其中serverdata获取需要比较长的时间,我想在它之前先显示panel,ThreadProcess对应如下:rn[code=C#]rn private void ThreadProcess()rn rn MyInvoke mi = new MyInvoke(ProcessShow);rn BeginInvoke(mi);rn rnrn private delegate void MyInvoke();rnrn private void ProcessShow()rn rn this.panel3.Show();rn rn[/code]rn我这样写应该没有问题吧,但是为什么还是在serverdata完全执行完成之后panel才显示,求教原因及解决方案!
c#winform多线程实现进度条
我作了一个小程序,在登陆窗体上点击登陆按钮,验证用户名和密码以后调出主窗体,现在我想在验证用户是否合法的同时,显示一个进度条,当进度条走完以后,主窗体再显示出来,本人刚开始学c#,肯请高手们帮帮忙,给个设计思想,有代码更好.先表示感谢了
c#winform多线程与进度控制
目的:界面不停刷新且StartThread同时执行ntimer1是winform.Timer,在tick事件刷新进度,但点击按钮后等到MessageBox.Show("ddd");才看到点点效果。为什么?nn private void button1_Click(object sender, EventArgs e)n n timer1.Enabled = true;n Thread fThread = new Thread(new ThreadStart(StartThread));//开辟一个新的线程n fThread.Start();n fThread.Join();n MessageBox.Show("ddd");nnn private void Timer1_Tick(object sender, EventArgs e)n n if(miIndex > 8)n n miIndex = 0;n n label1.Text = "".PadLeft(miIndex,'.')+"。"+ "".PadLeft(8 - miIndex, '.');n miIndex++;n n private void StartThread()n n tryn n Application.DoEvents();n int i = 0;n while (i < 999999999)n n i++;n n n catch (Exception ex)n n throw ex;n n finallyn n mbFinish = true;n nn
C#WinForm中水晶报表问题
用pull 模式在Form中做了水晶报表,用的是dataset做的。rnCrystalReport1 c1 = new CrystalReport1();rnrn c1.SetDataSource(wenDataSet1);rnrn crystalReportViewer1.ReportSource = c1; rn rn现在想添加条件查询,按照textbox的条件来执行查询。代码应该怎样写。rnrn或者用另外模式。但是小菜不知怎样做。另请大神出手
c#winform多线程与进度控制,急急
目的:界面不停刷新且StartThread同时执行rntimer1是winform.Timer,在tick事件刷新进度,但点击按钮后等到MessageBox.Show("ddd");才看到点点效果。为什么?rnrn private void button1_Click(object sender, EventArgs e)rn rn timer1.Enabled = true;rn Thread fThread = new Thread(new ThreadStart(StartThread));//开辟一个新的线程rn fThread.Start();rn fThread.Join();rn MessageBox.Show("ddd");rnrnrn private void Timer1_Tick(object sender, EventArgs e)rn rn if(miIndex > 8)rn rn miIndex = 0;rn rn label1.Text = "".PadLeft(miIndex,'.')+"。"+ "".PadLeft(8 - miIndex, '.');rn miIndex++;rn rn private void StartThread()rn rn tryrn rn Application.DoEvents();rn int i = 0;rn while (i < 999999999)rn rn i++;rn rn rn catch (Exception ex)rn rn throw ex;rn rn finallyrn rn mbFinish = true;rn rnrn
C#WinForm,多线程快速刷新界面。
C#WinForm,多线程快速刷新界面。没什么高级技术。只希望能解决一下需要多线程与UI快速交互的朋友的问题。
C#winform问题!
要实现这样的一个功能:获取一个用户table(userID,password),动态的!要显示在窗体上,目前是以checkedlistbox做的,要实现这样的功能,当选中一个用户的时候会弹出一个新窗口,让对应的用户输入其密码,如果密码正确,则对应的checkbox选中,不正确则不选!该怎么做?rnrn或者是我的思路不对,还是要动态添加checkbox控件和事件?
C#winform程序中解码问题
如何将 "val":"#ff0000","name":"\u7ea2\u8272" 这段代码解码。 我用一个工具测试rn 显示 usc2转ansi: "val":"#ff0000","name":"红色"rnrnrn在线等,谢谢啦!
C#winform中bool类型问题
user.IsAdmin = bool.Parse(this.cboIsAdmin.SelectedValue.ToString()); 这句话老是报错“System.FormatException”类型的未经处理的异常在 mscorlib.dll 中发生 其他信息: 该字符串未被识别为有效的布尔值。rnrn是哪个地方写错了吗?rn
c#winform问题
form大小改变后,如何使form中的dataGrid textbox panel等也随着form一起改变
C#winform的问题
我在winform中写了如下代码nif(textbox.text==“”)nmessagebox.show(请输入内容)n如果textbox里面什么没输就直接关闭程序,关闭后还会跳出“请输入内容”的窗口。请问怎么解决,关闭窗体后不会再提示?n
C#winform中sql的查询语句问题
我没有权限去修改这个数据库,只能调取内容rnrn数据库中有三个表A,B,CrnrnA表内有SID,时间,学生,学生性别rnB表内有SID,TID,时间rnC表内有TID,教师,教师性别rnrn我需要在一个dataGridView1,显示学生,学生性别,教师,教师性别的信息。rn问题的关键是,显示的这些信息都是按时间搜索的,但是A表和B表内不知道为什么有两个一模一样的时间的列rnrn string sql = "select 学生,学生性别,教师,教师性别 from 表C" +rn " JOIN 表A ON(表A.SID = 表B.SID) " +rn " JOIN 表B ON(表B.TID = 表C.TID) " +rn "where 时间 = '" + textBox1.Text + "'";rnrn这样就会报错,应该是因为表A和表B内都有时间这一列的原因。rnrn求问该怎么解决这个问题,我不能去修改这个数据库,因为没有权限。
C#winform中axWindowsMediaPlayer1的一个问题
在C#winform中用了一个axWindowsMediaPlayer1用来播放电影,axWindowsMediaPlayer1的默认缩放(视频大小)是100%,要怎样才能设置它的缩放是200%呢?还有要怎样才能使它禁止使用右键?
C#winform 问题
那个textbox,怎么控制它只接受数字rnrn还有 那个身份证号码 和 电话号码 E-mail 怎么 验证他输入的是正确的格式。rnrnrn 做了一个图书管理的 很是没含量。加点什么新奇的东东啊
C#winform问题
用C#窗体程序设置一个button,当点击这个button时,显示下面这个图[img=https://img-bbs.csdn.net/upload/201608/09/1470748195_759282.jpg][/img]rnrn这个大概怎么实现,越详细越好!rn谢谢大家!
c#winform中ZedGraphControl的清空问题
分别在ZedGraphControl中生成柱形图,饼形图,曲线图,折线图等rn但是没办法清空上一次生成的统计图,有谁知道原因?rn我写了如下的清空:rn[code=C#]rn GraphPane myPane = zg1.GraphPane;rn //清空绘制区rn myPane.CurveList.Clear();rn myPane.GraphObjList.Clear();rn 。。。。。。。。。。。。。rn zg1.AxisChange();rn zg1.Refresh();rn[/code]
C#WINFORM GDI+中的Invalidate()问题.
在程序中加入这段为什么画不出个椭圆? 而将第一句去掉则可达到目的.为什么?rnrn Invalidate();rn Graphics grfx = CreateGraphics();rn Pen pen = new Pen(Color.Red);rn Rectangle rect = new Rectangle(0,0,33,111);rn for(int iAngle = 0;iAngle<360;iAngle+=15)rn grfx.DrawArc(pen,rect,iAngle,10); rn
c#winform多线程来操作数据库好不好?
winform程序,如果要向数据库插入成千上万条数据话的需要很长时间界面肯定卡死状态,所以我想把数据库操作写在线程里再弄个进度条,为什么网上有人说写在线程里不好呢?
C#Winform异步多线程和线程池集成的用法
本程序详细介绍了线程和线程池的用法,使用多线程进行和异步编程实现数据库操作和日志的记录
C#Winform利用多线程+Socket实现局域网聊天程序
C#Winform利用多线程+Socket实现局域网聊天程序
简单C#winform多线程委托调用进度条!
简单winform多线程调用进度条的例子 BeginInvoke
C#WinForm
把一个学生的成绩的Excel表放到数据库,现在要求Excel中只要是属于课程的,比如:语文,数学等,都要放到数据库中表里的课程下面,其它的不用转换,求C#最牛方法!
c#winform
怎样将从GPRS接受的数据存入SQL中啊,还有就是怎样接受的数据用曲线图显示出来?
C#winform
窗体加载事件中实例化了多个控钮,给按钮添加单击事件好使,但是添加双击事件就不好使
C#Winform
请问如何将panel1的部分区域放大显示在panel2中?比如panel1的以(0,0)为起点,大小为(10,20)的矩形区域放大2倍显示在panel2中,期待回复,不胜感激~
c#winform中多线程怎么轮流执行同一个方法
需求:用多线程实现多个label同时移动,例如窗口中有六个点,label1从a点移动到b点,label2从c点移动到d点,label3从e点移动到f点rn[img=https://img-bbs.csdn.net/upload/201709/06/1504685246_317834.png][/img]
C#winform中的验证码代码
比较容易,比较简单,比较容易学习的验证码!
C#Winform窗体中验证码
请问下,winfom窗体中,该用什么方法来实现“生成验证码”的问题(即像asp.net中一样),具体的步骤??rn有代码的更好(C#代码)???
C#winform开发中遇到问题
有关于radiobutton的rn[code=csharp] private void btnQuery_Click(object sender, EventArgs e)rn rn BindGrid();rn rnrn private void PJWJA_Load(object sender, EventArgs e)rn rn this.dgvPrdt.AutoGenerateColumns = false;rn rnrnrn private void BindGrid()rn rn string strSql;rn strSql = @"SELECT TI_NO,TI_DD,NAME,BIL_NO FROM MF_TI LEFT OUTER JOIN SALM ON SALM.SAL_NO=MF_TI.SAL_NO WHERE CLOSE_ID='F' AND 1=1 ";rnrn if (RdoSfpjy.Checked = true)rn rn strSql += "AND BIL_ID = 'PO'";rn rn if (RdoZcpjy.Text.Trim().Length > 0)rn rn strSql += "AND BIL_ID = 'MO'";rn rn if (RdoTwjy.Text.Trim().Length > 0)rn rn strSql += "AND BIL_ID = 'TW'";rn rn if (RdoGxjy.Text.Trim().Length > 0)rn rn strSql += "AND BIL_ID = 'TZ'";rn rnrn RemoteCallReturnWithDataset rmtPrdt = ErpBasic.Cls_Common.GetDataFromDB(strSql);rn DataTable dtbPrdt = rmtPrdt.ExecuteReturnData.Tables[0];rnrn this.dgvPrdt.DataSource = dtbPrdt;rn if (null != dtbPrdt)rn rn this.txtInfo.Text = "查询完成,共 " + dtbPrdt.Rows.Count + "条信息.";rn rnrn [/code]rnrn原代码如下,我的问题是我在点击查询的时候,我的radiobutton按钮里面我已经赋值了,在if哪里。可能为什么查询后没结果呢?
C#winform中预览PDF_EXCEL_WORD_DWG_JPG_JPEG_PNG_BMP
C#winform中预览PDF_EXCEL_WORD_DWG_JPG_JPEG_PNG_BMP,包含控件跟源代码。
C#winform中如何上传文件
在C#winform中如何上传文件,谢谢!
C#Winform中窗体的美化
机房合作项目正在最近如火如荼的进行着,一个好看的界面是一个项目的基础,所以该怎样让我们项目的界面更好的美化一下呢,组长把这个活交给了我,我也就义不容辞的接下来了,在美化的过程中发现这个世界真的好神奇,我们真的应该站在巨人的肩膀上学习。下面就和大家一起来看一下我的美化之路吧。
C#winform中,控件复制
请教:rn程序运行时只有一个pannel,这个pannel内有一个datagridview控件,已经设计好,根据需要动态添加了一些pannel,想把第-个pannel中的datagridview完全复制到新添加的pannel怎么做,没有找到datagridviewr的lclone或copy方法
c#winform中数据导入导出。
c#中数据导入导出:rn本人正在设计一个数据导入导出的小程序,不知道那位高手有参考的实例没有?帮我指点指点。
C#winform中动态生成控件
第一次玩这个,自己在学习过程中需要用到动态生成控件,参考了些资料,写了个生成label控件的方法,希望大家喜欢。
Log4Net在C#Winform中应用
我想问一下Log4Net在C# Winform中如何应用,希望大家给出具体的例子,这个东西我在网上查了一下,大部分是webform的,讲的就是先在配置文件中配置,然后再写个继承的类,直接加引用,但具体操作,如何来写这个配置文件,及这个类,看的很模糊,所以希望大家帮忙详细讲解一下。。。
C#winform中datagridview合并单元格
[b]大神解救!!C#winform中datagridview空值单元格如何向左合并,求代码求算法!,这个听起来有点绕,我解释下,首先是合并单元格功能啦,然后要求自动检索到空值的单元格,并向左向非空值的单元格合并![img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/monkey/31.gif][/img]真心不懂,虚心求救,如能QQ(1170516873)传授,更加感激不尽[/b][size=14px][/size]
C#winform中Picturebox使用
在C#winform窗体中,datagridview中保存的图片的路径,如何实现datagridview 点击后显示的图片在picturebox上??
相关热词 c#入门推荐书 c# 解码海康数据流 c# xml的遍历循环 c# 取 查看源码没有的 c#解决高并发 委托 c#日期转化为字符串 c# 显示问号 c# 字典对象池 c#5.0 安装程序 c# 分页算法