C#的RunWorkerAsync()不会触发的DoWork() [英] C#: RunWorkerAsync() doesn't trigger DoWork()

查看:2974
本文介绍了C#的RunWorkerAsync()不会触发的DoWork()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我写一个基于小窗体应用程序连接到LDAP服务器,而我想要的连接按钮,在后台工作。所以,我是继信息和讨论 <一href="http://stackoverflow.com/questions/3065700/how-to-start-and-stop-a-continuously-running-background-worker-using-a-button">here

但由于某种原因,我的code似乎没有正常时:我在设置断点'worker.RunWorkerAsync();'它仅几步之遥的权利,通过它。

我是什么做错了吗?我工作在Visual Studio 2010中,如果它很重要。

 使用系统;
使用System.Collections.Generic;
使用System.ComponentModel;
使用System.Data这;
使用System.Drawing中;
使用System.Linq的;
使用System.Text;
使用System.Windows.Forms的;
使用System.DirectoryServices中;
使用的System.Threading;

命名空间ldapconnect
{


公共部分类Form1中:形态
{
    私人无效Form1_Load的(对象发件人,EventArgs的)
    {

    }

    公共Form1中()
    {
        的InitializeComponent();
    }

    //服务器
    公共字符串LDS;
    //命名上下文
    公共串根;

    公共字符串的用户名;
    公共字符串密码;

    BackgroundWorker的工作人员=新的BackgroundWorker();

    私人无效worker_DoWork(对象发件人,DoWorkEventArgs E)
    {
        工人=发件人为BackgroundWorker的;
        的foreach(字符串s的连接(工人,E,LDS +/+根,txt_user.Text.ToString(),txt_pass.Text.ToString()))
        {
            rtb_results.Text + = S +\ r \ N的;
        }
    }

    私人列表&LT;字符串&GT;连接(BackgroundWorker的工作者,DoWorkEventArgs即字符串SERV,串USR,串通)
    {
        //目录搜索code。考虑服务器的路径和creds从形式传递
        康涅狄格州的DirectoryEntry =新的DirectoryEntry(SERV,USR,通过);
        DirectorySearcher从DS =新DirectorySearcher从(康涅狄格州);

        //我只希望用户
        ds.Filter =对象类=用户;

        名单&LT;字符串&GT; sendBack =新的名单,其中,串&GT;();

        尝试
        {
            SearchResultCollection结果= ds.FindAll();

            的foreach(信息搜索结果导致的结果)
            {
                sendBack.Add(result.ToString());
            }
        }
        赶上(例外前)
        {
            sendBack.Clear();
            sendBack.Add(ex.ToString());
        }

        返回sendBack;
    }

    //连接键式启动后台工作
    私人无效btn_connect_Click(对象发件人,EventArgs的)
    {
        worker.RunWorkerAsync();
    }

    //退出按钮
    私人无效btn_close_Click(对象发件人,EventArgs的)
    {
        this.Close();
    }

    //设置服务器路径
    私人无效btn_server_Click(对象发件人,EventArgs的)
    {
        字符串SERV =输入框(LDAP://,IP或LDS服务器的DNS名称,);
        LDS = SERV;
        lbl_server.Text = LDS;
    }

    //设置默认的上下文
    私人无效btn_context_Click(对象发件人,EventArgs的)
    {
        字符串CNTX =输入框(在CN =,DC =,DC =形式:,默认命名上下文,);
        根= CNTX;
        lbl_cntx.Text =根;
    }

    // VB交互盒
    私人字符串输入框(字符串,字符串B,串c)
    {
        返回Microsoft.VisualBasic.Interaction.InputBox(A,B,C);
    }

    私人无效btn_Defaults_Click(对象发件人,EventArgs的)
    {
        LDS =LDAP://127.0.0.1;
        根=DC =用户,DC =测试,DC =本地;
        txt_user.Text =读者;
        txt_pass.Text =密码;
        lbl_server.Text = LDS;
        lbl_cntx.Text =根;
    }
}
}
 

解决方案

您从来没有布线了该事件。

 公共Form1中()
    {
        的InitializeComponent();
        worker.DoWork + =新DoWorkEventHandler(worker_DoWork);
    }
 

I am writing a small forms based application to connect to an LDAP server, and I wanted the "connect" button to work in the background. So I was following the information and discussion here

but for whatever reason my code doesn't appear to be working right: I set a breakpoint at 'worker.RunWorkerAsync();' And it just steps right through it.

What am I doing wrong? I am working in Visual Studio 2010, in case it matters.

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;
    }
}
}

解决方案

You are never wiring up the event.

   public Form1()
    {
        InitializeComponent();
        worker.DoWork += new DoWorkEventHandler(worker_DoWork);
    }

这篇关于C#的RunWorkerAsync()不会触发的DoWork()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆