[英]The BackgroundWorker RunWorkerAsync method does not trigger DoWork();
[英]C#: RunWorkerAsync() doesn't trigger DoWork()
我正在編寫一個基於小型表單的應用程序來連接到LDAP服務器,我希望“連接”按鈕在后台工作。 所以我在這里關注的信息和討論
但無論出於何種原因,我的代碼似乎沒有正常工作:我在'worker.RunWorkerAsync();'設置斷點 它只是直接通過它。
我究竟做錯了什么? 我在Visual Studio 2010中工作,以防萬一。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.DirectoryServices;
using System.Threading;
namespace ldapconnect
{
public partial class Form1 : Form
{
private void Form1_Load(object sender, EventArgs e)
{
}
public Form1()
{
InitializeComponent();
}
//server
public string lds;
//naming context
public string root;
public string username;
public string password;
BackgroundWorker worker = new BackgroundWorker();
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
worker = sender as BackgroundWorker;
foreach (string s in connect(worker, e, lds + "/" + root, txt_user.Text.ToString(), txt_pass.Text.ToString()))
{
rtb_results.Text += s + "\r\n";
}
}
private List<string> connect(BackgroundWorker worker, DoWorkEventArgs e, String serv, string usr, string pass)
{
//Directory search code taking server path and creds passed in from form
DirectoryEntry conn = new DirectoryEntry(serv, usr, pass);
DirectorySearcher ds = new DirectorySearcher(conn);
//I only want users
ds.Filter = "objectClass=user";
List<string> sendBack = new List<string>();
try
{
SearchResultCollection results = ds.FindAll();
foreach (SearchResult result in results)
{
sendBack.Add(result.ToString());
}
}
catch (Exception ex)
{
sendBack.Clear();
sendBack.Add(ex.ToString());
}
return sendBack;
}
//connect button start background worker
private void btn_connect_Click(object sender, EventArgs e)
{
worker.RunWorkerAsync();
}
//Exit Button
private void btn_close_Click(object sender, EventArgs e)
{
this.Close();
}
//set server path
private void btn_server_Click(object sender, EventArgs e)
{
string serv = inputBox("ldap://", "IP or DNS Name of LDS Server", "");
lds = serv;
lbl_server.Text = lds;
}
//set default context
private void btn_context_Click(object sender, EventArgs e)
{
string cntx = inputBox("In CN=,DC=,DC= Form:", "Default Naming Context", "");
root = cntx;
lbl_cntx.Text = root;
}
//VB interaction box
private string inputBox(string a,string b,string c)
{
return Microsoft.VisualBasic.Interaction.InputBox(a, b, c);
}
private void btn_Defaults_Click(object sender, EventArgs e)
{
lds = "LDAP://127.0.0.1";
root = "DC=USERS,DC=TEST,DC=LOCAL";
txt_user.Text = "reader";
txt_pass.Text = "password";
lbl_server.Text = lds;
lbl_cntx.Text = root;
}
}
}
你永遠不會把事件搞定。
public Form1()
{
InitializeComponent();
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
}
你沒有設定
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
在調用worker.RunAsync()
之前
如果您仍有事件且無法正常工作,請嘗試以下操作
打電話吧
System.Windows.Forms.Application.DoEvents();
在調用RunWorkerAsync()之前
RunWorkerAsync()
啟動工作線程並立即返回,因此調試器似乎“單步執行”。 在worker_DoWork()
方法中設置斷點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.