C# 使用后台工作程序从另一个类向textbox追加文本

C# 使用后台工作程序从另一个类向textbox追加文本,c#,textbox,backgroundworker,C#,Textbox,Backgroundworker,很抱歉用这么小的问题打扰你们,但我找不到解决办法。我创建了一个类,用于从exchange server获取附件,并创建了一个表单,用于添加服务器配置和文本框,用于日志输出。我添加了backgroundWorker来创建单独的线程,当类获得正确的附件并收集输出信息时,它会重定向到backgroundWorker DoWork方法。问题是textbox的UI只是不想附加文本 用于下载附件的类如下所示: namespace DownloadAttachmentExchange { class

很抱歉用这么小的问题打扰你们,但我找不到解决办法。我创建了一个类,用于从exchange server获取附件,并创建了一个表单,用于添加服务器配置和文本框,用于日志输出。我添加了backgroundWorker来创建单独的线程,当类获得正确的附件并收集输出信息时,它会重定向到backgroundWorker DoWork方法。问题是textbox的UI只是不想附加文本

用于下载附件的类如下所示:

namespace DownloadAttachmentExchange
{
    class ExchangeDwnClass
    {
    private string path_ = "";
    private string filterSender_ = "";
    private string subject_ = "";
    private string id_ = "";
    private string username_ = "";
    private string password_ = "";
    private string exchange_ = "";
    private string filterExcel_ = "";
    private string filterCSV_ = "";
    private string attachmentName_ = "";
    private int emailFetch_ = 0;
    private DateTime current_;

    ExchangeService serv = new ExchangeService(ExchangeVersion.Exchange2010_SP1);


    public string Path
    {
        get { return path_; }
        set { path_ = value; }
    }
    public string FilterSender
    {
        get { return filterSender_; }
        set { filterSender_ = value; }
    }
    public string Subject
    {
        get { return subject_; }
        set { subject_ = value; }
    }
    public string ID
    {
        get { return id_; }
        set { id_ = value; }
    }
    public string Username
    {
        get { return username_; }
        set { username_ = value; }
    }
    public string Password
    {
        get { return password_; }
        set { password_ = value; }
    }
    public string Exchange
    {
        get { return exchange_; }
        set { exchange_ = value; }
    }
    public string FilterExcel
    {
        get { return filterExcel_; }
        set { filterExcel_ = value; }    
    }
    public string FilterCsv
    {
        get { return filterCSV_; }
        set { filterCSV_ = value; }
    }
    public string AttachementName
    {
        get { return attachmentName_; }
        set { attachmentName_ = value; }
    }
    public int EmailFetch
    {
        get { return emailFetch_; }
        set { emailFetch_ = value; }
    }
    public DateTime CurrentDate
    {
        get { return current_; }
        set { current_ = value; }
    }

    public void GetAttachments()
    {
        try
        {  
            serv.Credentials = new WebCredentials(Username, Password);
            serv.AutodiscoverUrl(Exchange);

            ItemView view = new ItemView(10);
            FindItemsResults<Item> result = serv.FindItems(WellKnownFolderName.Inbox, new ItemView(EmailFetch));

            if (result != null && result.Items != null && result.Items.Count > 0)
            {
                foreach (Item item in result.Items)
                {
                    EmailMessage msg = EmailMessage.Bind(serv, item.Id, new PropertySet(BasePropertySet.IdOnly, ItemSchema.Attachments, ItemSchema.HasAttachments, EmailMessageSchema.From, EmailMessageSchema.Sender));
                    if (msg.Sender.ToString().Contains(FilterSender) && msg.From.ToString().Contains(FilterSender))
                    {
                        foreach (Attachment att in msg.Attachments)
                        {
                            if (att is FileAttachment)
                            {
                                FileAttachment file = att as FileAttachment;
                                if (file.Name.Contains(FilterExcel) || file.Name.Contains(FilterCsv))
                                {
                                    Form1 form = new Form1();
                                    file.Load(Path +"\\"+ file.Name);
                                    AttachementName = file.Name.ToString();
                                    Subject = item.Subject.ToString();
                                    ID = item.Id.ToString();
                                    CurrentDate = DateTime.Now;                                 
                                    form.date = CurrentDate.ToString();
                                    form.subject = Subject;
                                    form.attachment = AttachementName;         
                                    form.backgroundWorker1.RunWorkerAsync();
                                    Thread.Sleep(60000);
                                }
                            }
                        }
                    }
                    //item.Delete(DeleteMode.HardDelete);
                }
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
        Console.ReadLine();
    }
    public void StopDownloadingAttachment()
    { 

    }
}
}
如您所见,我正在使用以下命令从ExchangeDwnClass类调用后台工作程序,我相信这是可以的:

form.backgroundWorker1.RunWorkerAsync()

当我运行调试器时,它实际上跳转到后台工作程序

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    logOutputTxt.Text = "\n" + date + " , Message subject: " + subject + " , Attachment name: " + attachment + "\r";
    //backgroundWorker1.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted;
}
由于某些原因,表单文本框控件未刷新输出。 p、 我也在RunWorkerCompleted方法上创建了,但也没有运气


有什么线索可以帮助我解决问题吗?

好的,问题是我在Form1的ExchangeDowClass表单中创建了另一个对象,而不是将引用对象传递到方法GetAttachments中

complete code for Form1:

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;

namespace DownloadAttachmentExchange
{
public partial class Form1 : Form
{
    private string path = "";
    public string subject = "";
    public string attachment = "";
    public string date = "";
    public string sender = "";
    public Form1()
    {
        InitializeComponent();
    }
    ExchangeDwnClass exchange = new ExchangeDwnClass();
    BackgroundWorker bgrWorker = new BackgroundWorker();
    private void button3_Click(object sender, EventArgs e)
    {
        if(folderBrowserDialog1.ShowDialog(this)== DialogResult.OK)
        {
            path = folderBrowserDialog1.SelectedPath;   
            exchange.Path = path;
            pathTxt.Text = path;
        }
    }

    private void onBtn_Click(object sender, EventArgs e)
    {
        exchange.EmailFetch=Convert.ToInt32(fetchUpDown.Value);
        exchange.FilterSender = fromFilterTxt.Text;
        exchange.Exchange = exchangeTxt.Text;
        exchange.Password = passwdTxt.Text;
        exchange.Username = userTxt.Text;
        backgroundWorker1.RunWorkerAsync();
    }

    private void filterExcelCheck_CheckedChanged(object sender, EventArgs e)
    {
        if (filterExcelCheck.CheckState == CheckState.Checked)
        {
            exchange.FilterExcel = ".xlsx";
        }
        else
        {
            exchange.FilterExcel = "";
        }
    }

    private void filterCSVCheck_CheckedChanged(object sender, EventArgs e)
    {
        if (filterCSVCheck.CheckState == CheckState.Checked)
        {
            exchange.FilterCsv = ".csv";
        }
        else
        {
            exchange.FilterCsv = "";
        }
    }

    private void exchangeTxt_MouseHover(object sender, EventArgs e)
    {
        tipLbl.Visible = true;
        tipLbl.Text = "It is usually same as email address...";
    }

    private void exchangeTxt_MouseLeave(object sender, EventArgs e)
    {
        tipLbl.Visible = false;
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        //logOutputTxt.Text += "\n" + date + " , Message subject: " + subject + " , Attachment name: " + attachment + "\r"
        //backgroundWorker1.ReportProgress(0);
        exchange.GetAttachments(this);
    }
    private void Form1_Load(object sender, EventArgs e)
    {
        this.backgroundWorker1.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.backgroundWorker1_ProgressChanged);
    }

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        logOutputTxt.Text += "\n" + date + " , Sender: "+sender+" , Message subject: " + subject + " , Attachment name: " + attachment + "\r";
    }

}
}
对于ExchangeDwnClass:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Exchange;
using Microsoft.Exchange.WebServices;
using Microsoft.Exchange.WebServices.Data;
using System.Threading;

namespace DownloadAttachmentExchange
{
class ExchangeDwnClass
{
    private string path_ = "";
    private string filterSender_ = "";
    private string subject_ = "";
    private string id_ = "";
    private string username_ = "";
    private string password_ = "";
    private string exchange_ = "";
    private string filterExcel_ = "";
    private string filterCSV_ = "";
    private string attachmentName_ = "";
    private int emailFetch_ = 0;
    private DateTime current_;

    ExchangeService serv = new ExchangeService(ExchangeVersion.Exchange2010_SP1);

    public string Path
    {
        get { return path_; }
        set { path_ = value; }
    }
    public string FilterSender
    {
        get { return filterSender_; }
        set { filterSender_ = value; }
    }
    public string Subject
    {
        get { return subject_; }
        set { subject_ = value; }
    }
    public string ID
    {
        get { return id_; }
        set { id_ = value; }
    }
    public string Username
    {
        get { return username_; }
        set { username_ = value; }
    }
    public string Password
    {
        get { return password_; }
        set { password_ = value; }
    }
    public string Exchange
    {
        get { return exchange_; }
        set { exchange_ = value; }
    }
    public string FilterExcel
    {
        get { return filterExcel_; }
        set { filterExcel_ = value; }    
    }
    public string FilterCsv
    {
        get { return filterCSV_; }
        set { filterCSV_ = value; }
    }
    public string AttachementName
    {
        get { return attachmentName_; }
        set { attachmentName_ = value; }
    }
    public int EmailFetch
    {
        get { return emailFetch_; }
        set { emailFetch_ = value; }
    }
    public DateTime CurrentDate
    {
        get { return current_; }
        set { current_ = value; }
    }

    public void GetAttachments(Form1 form)
    {
        try
        {  
            serv.Credentials = new WebCredentials(Username, Password);
            serv.AutodiscoverUrl("username@domain.lan");

            ItemView view = new ItemView(EmailFetch);
            FindItemsResults<Item> result = serv.FindItems(WellKnownFolderName.Inbox, new ItemView(EmailFetch));

            if (result != null && result.Items != null && result.Items.Count > 0)
            {
                foreach (Item item in result.Items)
                {
                    EmailMessage msg = EmailMessage.Bind(serv, item.Id, new PropertySet(BasePropertySet.IdOnly, ItemSchema.Attachments, ItemSchema.HasAttachments, EmailMessageSchema.From, EmailMessageSchema.Sender));
                    if (msg.Sender.ToString().ToLower().Contains(FilterSender) && msg.From.ToString().ToLower().Contains(FilterSender))
                    {
                        foreach (Attachment att in msg.Attachments)
                        {
                            if (att is FileAttachment)
                            {
                                FileAttachment file = att as FileAttachment;
                                if (file.Name.Contains(FilterExcel) || file.Name.Contains(FilterCsv))
                                {
                                    file.Load(Path +"\\"+ file.Name);
                                    form.attachment = file.Name.ToString();
                                    form.subject = item.Subject.ToString();
                                    //ID = item.Id.ToString();
                                    form.date = DateTime.Now.ToString();
                                    form.sender = msg.Sender.ToString();
                                    form.backgroundWorker1.ReportProgress(0);
                                    Thread.Sleep(60000);
                                }
                            }
                        }
                    }
                    //item.Delete(DeleteMode.HardDelete);
                }
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
        Console.ReadLine();
    }
    public void StopDownloadingAttachment()
    { 

    }
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用Microsoft.Exchange;
使用Microsoft.Exchange.WebServices;
使用Microsoft.Exchange.WebServices.Data;
使用系统线程;
命名空间下载AttachmentExchange
{
类交换wnclass
{
私有字符串路径_=“”;
私有字符串过滤器sender_quo;;
私有字符串主题_=”“;
私有字符串id_quo;;
私有字符串用户名\=“”;
私有字符串密码_=“”;
私有字符串交换_=”“;
私有字符串过滤器EXCEL_=”“;
私有字符串过滤器csv_quo;;
私有字符串attachmentName_=“”;
private int emailFetch_u2;=0;
私有日期时间当前值;
ExchangeService serv=新的ExchangeService(ExchangeVersion.Exchange2010_SP1);
公共字符串路径
{
获取{返回路径}
设置{path\=value;}
}
公共字符串过滤器
{
获取{return filterSender}
设置{filterSender_u=值;}
}
公共字符串主题
{
获取{返回主题}
设置{subject\=value;}
}
公共字符串ID
{
获取{return id}
设置{id\=value;}
}
公共字符串用户名
{
获取{返回用户名}
设置{username\=value;}
}
公共字符串密码
{
获取{返回密码}
设置{password\=value;}
}
公共字符串交换
{
获取{返回交换}
设置{exchange\=value;}
}
公共字符串过滤器EXCEL
{
获取{return filterExcel_;}
设置{filterExcel_U8;=值;}
}
公共字符串筛选器CSV
{
获取{return filterCSV_;}
设置{filterCSV_u=value;}
}
公共字符串AttachementName
{
获取{return attachmentName_quo;
设置{attachmentName_u=value;}
}
公共int EmailFetch
{
获取{return emailFetch}
设置{emailFetch\=value;}
}
公共日期时间当前日期
{
获取{返回当前值}
设置{current\=value;}
}
公共附件(表格1表格)
{
尝试
{  
serv.Credentials=新的WebCredentials(用户名、密码);
服务自动发现URL(“username@domain.lan");
ItemView视图=新的ItemView(EmailFetch);
FindItemsResults=serv.FindItems(WellKnownFolderName.Inbox,新项目视图(EmailFetch));
if(result!=null&&result.Items!=null&&result.Items.Count>0)
{
foreach(result.Items中的项)
{
EmailMessage msg=EmailMessage.Bind(serv,item.Id,new PropertySet(BasePropertySet.IdOnly,ItemSchema.Attachments,ItemSchema.HasAttachments,EmailMessageSchema.From,EmailMessageSchema.Sender));
if(msg.Sender.ToString().ToLower().Contains(FilterSender)和&msg.From.ToString().ToLower().Contains(FilterSender))
{
foreach(邮件附件中的附件附件附件)
{
如果(附件是文件附件)
{
FileAttachment file=att作为FileAttachment;
if(file.Name.Contains(FilterExcel)| | file.Name.Contains(FilterCsv))
{
file.Load(路径+“\\”+文件名);
form.attachment=file.Name.ToString();
form.subject=item.subject.ToString();
//ID=item.ID.ToString();
form.date=DateTime.Now.ToString();
form.sender=msg.sender.ToString();
form.backgroundWorker1.ReportProgress(0);
睡眠(60000);
}
}
}
}
//item.Delete(DeleteMode.HardDelete);
}
}
}
捕获(例外e)
{
控制台写入线(e.Message);
}
Console.ReadLine();
}
public void停止下载附件()
{ 
}
}
}
另外,我必须使用ProgressChanged方法刷新控件。。。 我仍然有一些小错误,比如文本框形式的双重输出,但这基本上是个小问题。 我希望这段代码对其他人有用


干杯

您不能从这样的后台线程更新UI控件。您需要使用
控件。调用
来更新using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Exchange;
using Microsoft.Exchange.WebServices;
using Microsoft.Exchange.WebServices.Data;
using System.Threading;

namespace DownloadAttachmentExchange
{
class ExchangeDwnClass
{
    private string path_ = "";
    private string filterSender_ = "";
    private string subject_ = "";
    private string id_ = "";
    private string username_ = "";
    private string password_ = "";
    private string exchange_ = "";
    private string filterExcel_ = "";
    private string filterCSV_ = "";
    private string attachmentName_ = "";
    private int emailFetch_ = 0;
    private DateTime current_;

    ExchangeService serv = new ExchangeService(ExchangeVersion.Exchange2010_SP1);

    public string Path
    {
        get { return path_; }
        set { path_ = value; }
    }
    public string FilterSender
    {
        get { return filterSender_; }
        set { filterSender_ = value; }
    }
    public string Subject
    {
        get { return subject_; }
        set { subject_ = value; }
    }
    public string ID
    {
        get { return id_; }
        set { id_ = value; }
    }
    public string Username
    {
        get { return username_; }
        set { username_ = value; }
    }
    public string Password
    {
        get { return password_; }
        set { password_ = value; }
    }
    public string Exchange
    {
        get { return exchange_; }
        set { exchange_ = value; }
    }
    public string FilterExcel
    {
        get { return filterExcel_; }
        set { filterExcel_ = value; }    
    }
    public string FilterCsv
    {
        get { return filterCSV_; }
        set { filterCSV_ = value; }
    }
    public string AttachementName
    {
        get { return attachmentName_; }
        set { attachmentName_ = value; }
    }
    public int EmailFetch
    {
        get { return emailFetch_; }
        set { emailFetch_ = value; }
    }
    public DateTime CurrentDate
    {
        get { return current_; }
        set { current_ = value; }
    }

    public void GetAttachments(Form1 form)
    {
        try
        {  
            serv.Credentials = new WebCredentials(Username, Password);
            serv.AutodiscoverUrl("username@domain.lan");

            ItemView view = new ItemView(EmailFetch);
            FindItemsResults<Item> result = serv.FindItems(WellKnownFolderName.Inbox, new ItemView(EmailFetch));

            if (result != null && result.Items != null && result.Items.Count > 0)
            {
                foreach (Item item in result.Items)
                {
                    EmailMessage msg = EmailMessage.Bind(serv, item.Id, new PropertySet(BasePropertySet.IdOnly, ItemSchema.Attachments, ItemSchema.HasAttachments, EmailMessageSchema.From, EmailMessageSchema.Sender));
                    if (msg.Sender.ToString().ToLower().Contains(FilterSender) && msg.From.ToString().ToLower().Contains(FilterSender))
                    {
                        foreach (Attachment att in msg.Attachments)
                        {
                            if (att is FileAttachment)
                            {
                                FileAttachment file = att as FileAttachment;
                                if (file.Name.Contains(FilterExcel) || file.Name.Contains(FilterCsv))
                                {
                                    file.Load(Path +"\\"+ file.Name);
                                    form.attachment = file.Name.ToString();
                                    form.subject = item.Subject.ToString();
                                    //ID = item.Id.ToString();
                                    form.date = DateTime.Now.ToString();
                                    form.sender = msg.Sender.ToString();
                                    form.backgroundWorker1.ReportProgress(0);
                                    Thread.Sleep(60000);
                                }
                            }
                        }
                    }
                    //item.Delete(DeleteMode.HardDelete);
                }
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
        Console.ReadLine();
    }
    public void StopDownloadingAttachment()
    { 

    }
}
}