1

私はC#に少し慣れていないので、概念実証クライアント/サーバーアプリケーションを作成しています。現在、バックグラウンドワーカーを使用して、クラスからリストボックスを更新しようとしています。このようにして、基本的なロギングを提供できます。リストボックスを使用するだけでは最適ではないことを理解しています。

このコードに基づいて、クラスにイベントハンドラーを追加しました: BackgroundWorkerは外部クラスからの進行状況を報告しますか?

ただし、次のエラーが発生します。「メソッドグループ」であるため、「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);
    }
}

Server.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 に答える