C#winform中的多线程问题

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

0

6个回答

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

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

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

1

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

0
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/ 
0

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

0

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

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C# winform多线程问题解决总结
一、多线程创建后,窗体出现假死nn解决:创建线程之后,在下面代码加上一句:Application.DoEvents();即可。nn二、窗口关闭时,线程全部停止nn解决:将其设置为后台进程:thread.IsBackground = true;但是有时需要循环创建线程时就不这么好使了,最后我用了简单粗暴的方法:System.Environment.Exit(0);nn三、窗口不关闭的情况下,线程停止...
c#之winform窗体多线程Thread应用
多线程的应用nn在面向对象编程中,经常会面对创建对象和销毁对象的情况,如果不正确处理的话,在短时间内创建大量对象然后执行简单处理之后又要销毁这些刚刚建立的对象,这是一个非常消耗性能的低效行为,所以很多面向对象语言中在内部使用对象池来处理这种情况,以提高性能,比如在ADO.NET内部就允许使用数据库...
c# winform 多线程测试例子(初学)
多线程开发例子 开发工具: VS2017 版本:framework4.6.1
C# winform 多线程 实现实时对账
1.winform 按钮点击事件rnprivate void button1_Click(object sender, EventArgs e)n {n //启动获取商户线程n Thread tGetSH = new Thread(Globle.GetAllSH);n tGetSH.Start();nn
C#WinForm,多线程快速刷新界面。
C#WinForm,多线程快速刷新界面。没什么高级技术。只希望能解决一下需要多线程与UI快速交互的朋友的问题。
C#多线程解决界面卡死问题的完美解决方案_极简版
C#多线程解决界面卡死问题的完美解决方案,简化了之前的写法,更容易记住和理解
C#Winform利用多线程+Socket实现局域网聊天程序
C#Winform利用多线程+Socket实现局域网聊天程序
C# Winform程序防止多开的方法总结(亲测)
1、Winform启动的时候,检测是否存在同样的进程名,防止程序多开;nnn static class Programn {n /// <summary>n /// 应用程序的主入口点。n /// </summary>n [STAThread]n static void Main()n ...
C#winform多线程问题
有一个委托A,跟踪显示一个方法B的执行进度,方法B是引用的C++的dll,在委托A的方法中有进度参数,无法放到界面显示。方法B是有ref值标记是否执行完毕的,方法B要根据界面选择个数多次执行。要如何实现呢?nn我是用while循环检测方法B是否执行完,执行完就执行下一次,但是委托A只能得到进度,无法更新到界面显示。n如果把while去掉,执行一次B没问题。用system.timer获取进度待while结束才显示在页面全部数据,用刷新也没用
关于c# winform 中 使用多线程实现后台定时刷新 datagridview 数据
背景nn本人c#新手,最近公司要求做的一个程序,需要利用后台定时查询数据绑定到datagridview上,要求程序不能出现假死,给人友好的体验,于是想到利用创建另一个线程用于查询数据然后再把数据显示在datagridview上。程序完成的时候,在本机上代码调试也没出问题,很完美,但是到了实际的运用的时候,datagridview的界面出了问题,没有数据并且显示一个大红叉,并且还报错。之前还以为是电...
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#多线程防界面假死等待窗体(用心版)
/**************************************************** * 等待窗体---长时间操作假死处理 * 遗留:显示操作进度 ****************************************************/ 测试:长时间等待,瞬间完成,显示动态显示操作信息, 代码有注释,多查查MSDN
C#Winform异步多线程和线程池集成的用法
本程序详细介绍了线程和线程池的用法,使用多线程进行和异步编程实现数据库操作和日志的记录
面试中多线程问题
面试中多线程问题面试中多线程问题
C#单线程及多线程演示。详细注释 源码
C#的单线程及多线程的演示。内含详细的注释 包含线程的详细说明。 适合新手观摩。
多线程与基类
-(void)click:(UIButton *)button{  nnNSInteger count=0;nn//线程卡死nnfor (NSInteger i=0; inncount++;nnNSLog(@"%ld",count);}nnNSLog(@"%ld",count);}nnnnn#pragma mark 第一种解决线程问题的方法 NSObject提供的
c# 委托实现多线程的实例
前面学习了委托,事件和多线程相关的知识。今天我们就通过在项目中常见的实例来加深对多线程的应用。nn一、使用线程在窗体中显示进度条nn在Winform应用程序中,经常用进度条显示进度信息。这时候就可能用到多线程。如果不采用多线程控制进度条的话,窗口界面很容易假死(无法看到进度信息,看起来像界面卡住了)。 n在这个实例中,我们建立一个窗体,窗体中包括一个后台组件,一个进度条控件。当在主窗体中按“开始”...
C# Winform Datagridview 排序 多线程操作数据 遇到的坑
先上代码:rn public class BindingCollection : BindingListn {n protected bool isSorted;n protected PropertyDescriptor sortProperty;n protected ListSortDirection sortDirection;n
winform 利用线程 实现窗体图片轮播
之前做一个餐饮点餐系统,需要在主界面实现自定义的一些图片的轮播,起初使用定时器,但是当子窗体打开,主线程转移,图片轮播就停止了。rn随之使用线程来实现,当时查阅不少博客,与之契合的较少。所以贴上自己的代码,供后来者多一份参考~rn线程的使用需要注意: 1、开始时确认线程的调用状态。  2、程序结束、或功能完成后,判断线程状态,并关闭。rnusing System.Windows.Forms;nus
C#多线程委托
一个简单的C#多线程和委托更新UI的demo
C# WinForm线程与UI界面线程参数交互函数
rn为了线程的安全性和降低代码的依赖程度,C# windows编程中线程函数与调用的界面之间通信最好用委托来解决。rn rn参数交互函数如下:rn delegate void SetControlValueCallback(Control oControl, string propName, object propValue); //声明指向调用函数的委托rnrn /...
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才显示,求教原因及解决方案!
winform中多线程与定时器冲突
在winform中同时使用了定时器与多线程。n程序不稳定,有时会弹出异常System.InvalidOperationException。
C#单线程与多线程实例
C#单线程与多线程实例体现出单线程与多线程的区别
winfrom页面透明与闪烁问题(解决线程操作窗口控件闪烁问题)
第一步.n在构造函数里面添加这句代码n  protected override CreateParams CreateParamsn        {n            getn            {n                CreateParams cp = base.CreateParams;n                cp.ExStyle |= 0x02000000;...
C#/.net学习-13-一个多线程的摇奖winform小程序
using System;nusing System.Collections.Generic;nusing System.ComponentModel;nusing System.Data;nusing System.Drawing;nusing System.Linq;nusing System.Text;nusing System.Threading;nusing System.Threadi
C#多线程刷新界面卡死测试程序
1、测试调用委托时BeginInvoke和Invoke的表现差异 2、System.Timers.Timer多线程刷新界面 3、System.Threading.ThreadPool多线程刷新界面 4、System.Threading.Thread多线程刷新界面
C# winform动态创建和关闭多线程源码 可运行
C# winform 动态创建和 关闭多线程,基于VS2010的完整解决方案。 可运行
winform实现子线程动态更新UI
核心句法:this.invoke(new EventHandle(delegate                                            {                                                    panel.controls.add(usercontrol);                              ...
C#多线程解决界面卡死问题的完美解决方案
C#多线程解决界面卡死问题的完美解决方案
C#winform中Excel电子表格导入数据库示例
C#winform中Excel电子表格导入数据库示例C#winform中Excel电子表格导入数据库示例
c# winform下使用多线程时在线程里如何安全访问窗体控件InvokeRequired
首先我们都知道winform下使用多线程时线程里是不能直接访问窗体的,如果访问会导致异常发生,那么要如何解决呢,接下来看下面的代码:nn比如我们做一个抓取网页的程序,窗口要不断的显示抓去网页的信息情况,nn第一,我们建立一个richTextBox1文本控件,然后再申明一个委托,msg是要传入到richTextBox1里的信息nnnnn public delegate void del(s...
C#winform开发时遇到的错误信息
错误信息:The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.nn原因:使用EF创建数据库实体类,在使用时习惯使用using(数据库实体类 对象 = new 数据库实体类()){}nn解决方法:在Program.cs中创建一个数...
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
FileStream多文件上传源码 WinForm C#
Winform 选择多个文件上传,源代码,
单例模式解决多线程的问题
1、懒汉模式把getInstance()方法变成同步方法rnpublic class Singleton{n private static Singleton singleton;n private Singleton(){}n public static synchronized Singleton getInstance(){n if(singleton == null){n singl
java多线程遇到的问题总结
1、当有全局性的参数的时候,需要为每个线程单独深度复制一个参数对象,不然在一个线程中对参数的修改可能会影响其他线程中参数的值,而造成间歇性的错误,不容易排查;...
C#winform程序窗口全屏是否遮盖任务栏问题
C#winform程序窗口全屏是否遮盖任务栏问题
Java中的多线程(五大经典同步问题Scenario等)
WhatA thread is a lightweight sub process, a smalleset unit of processing. It is a separate path of execution. 每个线程是独立的,如果一个线程发生了异常是不会影响到另外的线程的。但是同一个进程的所有线程都共享同一块内存。下图可以帮助理解一下。(https://www.javatpoint....
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 java学习中常见的问题 java学习中遇到的问题