C#背景工人工作陷入困境
嘿,我有一个测试后台工作人员,他似乎被困在了DoWork方法上,或者RunWorkerCompleted没有被解雇,你们能看到这里有什么不对劲吗 也许我没有正确地实现这一点:/C#背景工人工作陷入困境,c#,.net,winforms,backgroundworker,C#,.net,Winforms,Backgroundworker,嘿,我有一个测试后台工作人员,他似乎被困在了DoWork方法上,或者RunWorkerCompleted没有被解雇,你们能看到这里有什么不对劲吗 也许我没有正确地实现这一点:/ using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using MailChimp;
using System.Threading;
using System.Runtime.InteropServices;
namespace Chimporter
{
public partial class Form1 : Form
{
//Worker thread flag set to false
static bool done = false;
//Console dll
[DllImport("Kernel32.dll")]
static extern Boolean AllocConsole();
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
}
private void label1_Click(object sender, EventArgs e)
{
}
private void accountInformationToolStripMenuItem_Click(object sender, EventArgs e)
{
//loadWindow pleaseWait = new loadWindow();
//pleaseWait.Show();
BackgroundWorker bg = new BackgroundWorker();
bg.DoWork += new DoWorkEventHandler(bg_DoWork);
bg.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bg_RunWorkerCompleted);
bg.RunWorkerAsync();
while (!done)
{
//Console.WriteLine("Waiting in Main, tid " + Thread.CurrentThread.ManagedThreadId);
//Thread.Sleep(100);
}
//AccountInfo accInfo = new AccountInfo();
//accInfo.Show();
}
public void bg_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (!AllocConsole())
{
Console.WriteLine("Fnished! " + Thread.CurrentThread.ManagedThreadId);
}
done = true;
}
public void bg_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i <= 3; i++)
{
if (!AllocConsole())
{
Console.WriteLine("Work Line: " + i + ", tid " + Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(500);
}
}
//string key = "e42713458882f6c2c27b3d6d951174a2-us6";
//var mc = new MCApi(key, true);
//string user = mc.GetAccountDetails().Username.ToString();
return;
}
private void menuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
}
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
//Exit application Form.Close()
Application.Exit();
}
}
}
使用系统;
使用System.Collections.Generic;
使用系统组件模型;
使用系统数据;
使用系统图;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用System.Windows.Forms;
使用MailChimp;
使用系统线程;
使用System.Runtime.InteropServices;
名称空间黑猩猩传输器
{
公共部分类Form1:Form
{
//工作线程标志设置为false
静态布尔完成=错误;
//控制台dll
[DllImport(“Kernel32.dll”)]
静态外部布尔alloconsole();
公共表格1()
{
初始化组件();
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
}
私有无效标签1_单击(对象发送方,事件参数e)
{
}
私有无效帐户信息工具StripMenuItem\u单击(对象发送者,事件参数e)
{
//loadWindow pleaseWait=新建loadWindow();
//请把它显示出来;
BackgroundWorker bg=新的BackgroundWorker();
bg.DoWork+=新DoWorkEventHandler(bg_DoWork);
bg.RunWorkerCompleted+=新的RunWorkerCompletedEventHandler(bg\u RunWorkerCompleted);
bg.RunWorkerAsync();
而(!完成)
{
//WriteLine(“在Main中等待,tid”+Thread.CurrentThread.ManagedThreadId);
//睡眠(100);
}
//AccountInfo accInfo=新AccountInfo();
//accInfo.Show();
}
public void bg_RunWorkerCompleted(对象发送方,RunWorkerCompletedEventArgs e)
{
如果(!alloconsole())
{
WriteLine(“Fnished!”+Thread.CurrentThread.ManagedThreadId);
}
完成=正确;
}
公共无效bg_DoWork(对象发送方,DoWorkEventArgs e)
{
对于(int i=0;i在(!done)
时取出你的。它正在锁定主线程。工作线程已完成事件在该线程上引发,但由于它在循环中忙碌,因此永远不会引发该事件
RunWorkerCompleted事件的整个要点是,您可以在主线程上收到通知,而不必将其锁定在繁忙的循环中,使gui没有响应。Hmm我的输出第三个控制台线程id,然后卡住,我的PC风扇声音更大:我看到三条“工作线”,然后是“完成”(,我会成为一个更好的编码员吗:(.谢谢大家:)