backgroundWorker调试无法进到我的代码,为什么?

lvsm2018 2015-12-07 10:42:42
代码如下,请大神指点·
public void Test()
{
for (int i = 0; i < 10; i++)
ExFaceSrv();
}


private void ExFaceSrv()
{
if (string.IsNullOrEmpty(启动时间))
{//第一次运行
启动时间 = DateTime.Now.ToString();
Loger.WriteLogEx("主线程已启动");
if (!backgroundWorker1.IsBusy)
{
backgroundWorker1.RunWorkerAsync();
}
Loger.WriteLogEx("Main:主线程已停止");

}
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
try
{
while (!backgroundWorker1.CancellationPending)
{
FaceAutoComParePro.Start();
Thread.Sleep(1000);
//sn++;
//Loger.WriteLogEx("Main,当前SN:" + sn);
}
}
catch (Exception ex)
{
string es = ex.Message;
}

}

public static void Start()
{
BLL bll = new BLL();
dts = bll.GetDataTables();
list = bll.GetCompareWfList();
Loger.WriteLogEx("本次比对量:" + list.Count);
if (CompareingQueue.Count <= 0)
CheckDbWait();
if (CompareingQueue.Count <= 0)
{
return;
}
ThreadStart ts = new ThreadStart(DoWork);
for (int i = 0; i < Process_MaxLength; i++)
{
tr[i] = new Thread(ts);//指定线程起始设置
tr[i].Start();
}
}
...全文
213 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
子线程执行完了会自动销毁,但频繁的创建-销毁线程是绝对应该避免的,系统中提供了线程池,尽量用这个 自己查下ThreadPool或者Task的用法
  • 打赏
  • 举报
回复
操作数据库记得用 using(var conn = new SqlConnection()) { 操作 }
lvsm2018 2015-12-07
  • 打赏
  • 举报
回复
引用 8 楼 dongxinxi 的回复:
还有,最好不要工作线程里再去开工作线程,很难管理,尽量只由专门的一个线程(通常是主线程)来统一管理
有 什么例子吗? 我现在就是建了一个线程当主线程,,主线程的工作里 再开机几个分线程,操作数据库一批数据的比较。。。我就是不知道分线程执行完了会不会自动销毁。。
  • 打赏
  • 举报
回复
还有,最好不要工作线程里再去开工作线程,很难管理,尽量只由专门的一个线程(通常是主线程)来统一管理
  • 打赏
  • 举报
回复
public void Test() { //开启异步调用取消 backgroundWorker1.WorkerSupportsCancellation = true; for (int i = 0; i < 10; i++) ExFaceSrv(); } 不加这个属性,DoWork一开始 while (!backgroundWorker1.CancellationPending) 永远都不可能取消,将是死循环
lvsm2018 2015-12-07
  • 打赏
  • 举报
回复
测试发现 ,凡是调用方法的地方,都会自动退出程序。。这是什么怪原因。。
lvsm2018 2015-12-07
  • 打赏
  • 举报
回复
引用 4 楼 lvfeng1989 的回复:
Test()你的这个方法是用来启动线程的,你都没有调用,你好好把你的代码看看,逻辑本身就不对 FaceAutoComParePro.Start(); 这个是用来做什么的
哎 我代码都贴出来了。。说了能运行了。。。我启动的时候就调用test了,start代码也贴在上面了。。。我发现只要进入方法,,backgroundWorker就自动退出程序了
lvfeng_95 2015-12-07
  • 打赏
  • 举报
回复
Test()你的这个方法是用来启动线程的,你都没有调用,你好好把你的代码看看,逻辑本身就不对 FaceAutoComParePro.Start(); 这个是用来做什么的
lvsm2018 2015-12-07
  • 打赏
  • 举报
回复
backgroundwoker有自己的线程启动,你不调用RunWorkerAsync()方法,线程是不会启动的。大哥你好好看看backgroundwoker吧。[/quote]
引用 2 楼 lvfeng1989 的回复:
[quote=引用 楼主 lvsm2018 的回复:] backgroundwoker有自己的线程启动,你不调用RunWorkerAsync()方法,线程是不会启动的。大哥你好好看看backgroundwoker吧。
if (!backgroundWorker1.IsBusy) { backgroundWorker1.RunWorkerAsync(); }这里调用了啊 我的代码运行到 while (!backgroundWorker1.CancellationPending) { FaceAutoComParePro.Start(); Thread.Sleep(1000); } 这个start的时候就退出了
lvfeng_95 2015-12-07
  • 打赏
  • 举报
回复
引用 楼主 lvsm2018 的回复:
代码如下,请大神指点· public void Test() { for (int i = 0; i < 10; i++) ExFaceSrv(); } private void ExFaceSrv() { if (string.IsNullOrEmpty(启动时间)) {//第一次运行 启动时间 = DateTime.Now.ToString(); Loger.WriteLogEx("主线程已启动"); if (!backgroundWorker1.IsBusy) { backgroundWorker1.RunWorkerAsync(); } Loger.WriteLogEx("Main:主线程已停止"); } } private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { try { while (!backgroundWorker1.CancellationPending) { FaceAutoComParePro.Start(); Thread.Sleep(1000); //sn++; //Loger.WriteLogEx("Main,当前SN:" + sn); } } catch (Exception ex) { string es = ex.Message; } } public static void Start() { BLL bll = new BLL(); dts = bll.GetDataTables(); list = bll.GetCompareWfList(); Loger.WriteLogEx("本次比对量:" + list.Count); if (CompareingQueue.Count <= 0) CheckDbWait(); if (CompareingQueue.Count <= 0) { return; } ThreadStart ts = new ThreadStart(DoWork); for (int i = 0; i < Process_MaxLength; i++) { tr[i] = new Thread(ts);//指定线程起始设置 tr[i].Start(); } }
backgroundwoker有自己的线程启动,你不调用RunWorkerAsync()方法,线程是不会启动的。大哥你好好看看backgroundwoker吧。

111,093

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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