WPF多线程出现UI卡顿,求救!!!

mylibin 2015-04-09 02:02:18
第一次用WPF,被多线程搞死了。写的代码出现了UI卡顿现象,求解救。多线程是从网上找的代码,和WInform用法,完成不同。是不是写的不对,求帮助。

int MaxID = 0;
int MinID = 0;
Thread oldThread;
Thread newThread;
DataTable all = new DataTable();
public MainWindow()
{
InitializeComponent();
//this.Title = GetApp.GetValue("Title");
oldThread = new Thread(new ThreadStart(OldDispatcherThread));
oldThread.IsBackground = true;
newThread = new Thread(new ThreadStart(NewDispatcherThread));
newThread.IsBackground = true;
}

private void Window_Loaded(object sender, RoutedEventArgs e)
{
//拉取当前10条数据
bindInit();

//获取老信息
oldThread.Start();
newThread.Start();
}
public void OldDispatcherThread()
{
//可以通过循环条件来控制UI的更新
while (true)
{
///线程优先级,最长超时时间,方法委托(无参方法)
listBox1.Dispatcher.Invoke(DispatcherPriority.Normal, TimeSpan.FromSeconds(1), new Action(NextData));
Thread.Sleep(3000);
}
}
public void NewDispatcherThread()
{
//可以通过循环条件来控制UI的更新
while (true)
{
///线程优先级,最长超时时间,方法委托(无参方法)
listBox1.Dispatcher.Invoke(DispatcherPriority.Normal, TimeSpan.FromSeconds(1), new Action(PreData));
Thread.Sleep(3000);
}
}
private void NextData()
{
bindData("info_id<" + MaxID, 2);
}
private void PreData()
{

}

private void bindInit()
{
//执行这个方法的时候,开始出现UI卡顿现象
string backStr = api.GetALLWLInfoData("", 10);
if (backStr != "")
{
all = GetSerializable(backStr) as DataTable;
}
if (all != null && all.Rows.Count > 0)
{
MaxID = int.Parse(all.Rows[all.Rows.Count - 1]["info_id"].ToString());
MinID = int.Parse(all.Rows[0]["info_id"].ToString());

listBox1.DataContext = all;
}
}

private void bindData(string filter,int source)
{
string backStr = api.GetALLWLInfoData(filter, 10);
DataTable dt = new DataTable();
if (backStr != "")
{
dt = GetSerializable(backStr) as DataTable;
}
if (dt != null && dt.Rows.Count > 0)
{
switch (source)
{
case 1:
MinID = int.Parse(all.Rows[0]["info_id"].ToString());
break;
case 2:
MaxID = int.Parse(all.Rows[all.Rows.Count - 1]["info_id"].ToString());
foreach (DataRow dr in dt.Rows)
all.ImportRow(dr);
//没有老数据,关闭拉取老数据进程
if (dt.Rows.Count == 0)
oldThread.Abort();
break;
default:
break;
}
//listBox1.DataContext = all;
}
}

/// <summary>
/// 对象反序列化
/// </summary>
/// <param name="str">序列化字符串</param>
/// <returns></returns>
public object GetSerializable(string str)
{
IFormatter formatter = new BinaryFormatter();
byte[] buffer = Convert.FromBase64String(str);
MemoryStream stream = new MemoryStream(buffer);
object obj = formatter.Deserialize(stream);
stream.Flush();
stream.Close();

return obj;
}
...全文
877 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
asq985 2017-04-24
  • 打赏
  • 举报
回复
您可以试一下异步委托 BeginInvoke
南哥1207 2017-04-21
  • 打赏
  • 举报
回复
最烦的就是一堆屁话,最后不说答案的~
mylibin 2015-04-09
  • 打赏
  • 举报
回复
引用 4 楼 wyd1520 的回复:
你一直循环他做啥?触发委托是有条件的才触发。
可以留个联系方式吗,可以请教你一下
mylibin 2015-04-09
  • 打赏
  • 举报
回复
引用 6 楼 wyd1520 的回复:
[quote=引用 5 楼 mylibin 的回复:] [quote=引用 4 楼 wyd1520 的回复:] 你一直循环他做啥?触发委托是有条件的才触发。
我需要一直拉取数据库里面的数据啊[/quote] 那你用Timer就可以了呀,看你是间隔三秒 就不要用线程 了。Timer就不会卡你的主UI了,也不要Sleep[/quote] 朋友,不行,使用DispatcherTimer,还是导致UI卡顿。
mylibin 2015-04-09
  • 打赏
  • 举报
回复
引用 6 楼 wyd1520 的回复:
[quote=引用 5 楼 mylibin 的回复:] [quote=引用 4 楼 wyd1520 的回复:] 你一直循环他做啥?触发委托是有条件的才触发。
我需要一直拉取数据库里面的数据啊[/quote] 那你用Timer就可以了呀,看你是间隔三秒 就不要用线程 了。Timer就不会卡你的主UI了,也不要Sleep[/quote] 哦哦,我试试,谢谢
本拉灯 2015-04-09
  • 打赏
  • 举报
回复
引用 5 楼 mylibin 的回复:
[quote=引用 4 楼 wyd1520 的回复:] 你一直循环他做啥?触发委托是有条件的才触发。
我需要一直拉取数据库里面的数据啊[/quote] 那你用Timer就可以了呀,看你是间隔三秒 就不要用线程 了。Timer就不会卡你的主UI了,也不要Sleep
mylibin 2015-04-09
  • 打赏
  • 举报
回复
引用 4 楼 wyd1520 的回复:
你一直循环他做啥?触发委托是有条件的才触发。
我需要一直拉取数据库里面的数据啊
本拉灯 2015-04-09
  • 打赏
  • 举报
回复
你一直循环他做啥?触发委托是有条件的才触发。
mylibin 2015-04-09
  • 打赏
  • 举报
回复
引用 1 楼 sp1234 的回复:
循环和阻塞,是多线程编程的大忌。你这种“先滥用线程,然后再线程中出现了循环加Sleep的程序”,还不如别用什么线程呢。
所以才要求教
  • 打赏
  • 举报
回复
所谓“从网上找的代码”,就像交友要比免交到总想忽悠亲戚的损友一样,要比免看一些无原则的滥用线程的代码。你应该看那些不滥用while、sleep的代码。
  • 打赏
  • 举报
回复
循环和阻塞,是多线程编程的大忌。你这种“先滥用线程,然后再线程中出现了循环加Sleep的程序”,还不如别用什么线程呢。

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧