1

我对 C# 有点陌生,我正在编写一个概念验证客户端/服务器应用程序。现在我正在尝试使用后台工作人员从类中更新列表框。这样我就可以提供基本的日志记录。我知道仅使用列表框并不是最佳选择。

我已经根据以下代码向我的班级添加了一个事件处理程序: BackgroundWorker report progress from external Class?

但是我收到以下错误:无法分配给“ReportProgress”,因为它是“方法组”

我试图减少我的代码只显示相关部分。另外我还没有完全实现上一课的代码,我只想知道我缺少什么导致错误。我觉得这可能很简单。

Form1.cs

namespace V12
{
    public partial class Form1 : Form
    {
    //Background Workers
    private BackgroundWorker serverWorker = new BackgroundWorker();

    public Form1()
    {
        InitializeComponent();
        //Server Backgroundworker
        serverWorker.WorkerReportsProgress = true;
        serverWorker.ReportProgress += new EventHandler<Server.ProgressArgs>(serverWorker_ReportProgress); //Error on this line
        serverWorker.DoWork += new DoWorkEventHandler(serverWorker_DoWork);
    }

private void serverWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        //my work is here

    }
    protected void serverWorker_ReportProgress(object sender, Server.ProgressArgs e)
    {
        serverWorker.ReportProgress(e.Percentage, e.Message);
    }
}

服务器.cs

namespace V12
{
public sealed class Server
{
    //Allows for updating of control on the UI Thread
    public EventHandler<ProgressArgs> ReportProgress;
    // Eventargs to contain information to send to the subscriber
    public class ProgressArgs : EventArgs
    {
        public int Percentage { get; set; }
        public object Message { get; set; }
    }
}
4

3 回答 3

2

ReportProgress是一种方法。

您正在尝试向ProgressReported事件添加处理程序。

于 2012-09-23T19:58:40.577 回答
0

我想你把自己弄糊涂了。ReportProgress不是事件委托,而是方法。看看BackgroundWorker.ProgressChanged 事件。我认为这是您正在寻找的处理程序。

于 2012-09-23T20:02:05.020 回答
0

看看这是否提供了您需要的线索...

 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;

 namespace WindowsFormsApplication2
 {
    public partial class Form3 : Form
    {
        Server server;

        public Form3()
        {
            InitializeComponent();

            server = new Server();

            BackgroundWorker wrkr = new BackgroundWorker();
            wrkr.WorkerReportsProgress = true;
            wrkr.RunWorkerCompleted += new RunWorkerCompletedEventHandler(wrkr_RunWorkerCompleted);
            wrkr.ProgressChanged += new ProgressChangedEventHandler(wrkr_ProgressChanged);
            wrkr.DoWork += new DoWorkEventHandler(wrkr_DoWork);
        }

        void wrkr_DoWork(object sender, DoWorkEventArgs e)
        {
            // do work...perhaps you might be incrementing a progress meter...
            for (int i = 0; i < 100; i++)
            {
                ((BackgroundWorker)sender).ReportProgress(i,"Some message...");
            }

            e.Result = "some result...";
        }

        void wrkr_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            // here you can use e.ProgressPercentage and e.UserState
            // to change the state of something on the thread the worker was created on...
            server.Percentage = e.ProgressPercentage;
            server.Message = e.UserState.ToString();
        }

        void wrkr_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            // here you can do some final stuff. clean-up etc.
            server.Percentage = 100;
            server.Message = e.Result.ToString();
        }
    }
}
于 2012-09-23T20:27:42.973 回答