Относительно реализации / использования Background Worker - PullRequest
1 голос
/ 19 октября 2011

Хорошо, я осмотрелся и не могу найти подходящий ответ на свой вопрос.У меня довольно сложная кодовая база, которая использует таймер, чтобы инициировать создание фонового работника для передачи чего-либо через равные промежутки времени.

Я сталкиваюсь с проблемой, когда она вызывает ReportProgress:на него и дальнейшие вызовы недопустимы. "

Stack Trace:

at System.ComponentModel.AsyncOperation.VerifyNotCompleted()
at System.ComponentModel.AsyncOperation.Post(SendOrPostCallback d, Object arg)
at System.ComponentModel.BackgroundWorker.ReportProgress(Int32 percentProgress, Object userState)
at NAME.TX.Work(Object sender, DoWorkEventArgs e) in file.cs:line 68
at System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs e)
at System.ComponentModel.BackgroundWorker.WorkerThreadStart(Object argument)

Мой вопрос относительно прост: функция, вызываемая при выключении таймера, создает нового фонового работника,но действительно ли это новый фоновый работник?

Мой код (упрощенный, потому что он очень громоздкий):

//THIS IS THE FUNCTION CALLED BY TIMER
public void TransmitMSG(MSG msg)
{
        //Initialze _tx
        this.m_thread = new BackgroundWorker();
        m_thread.WorkerReportsProgress = true;

        //Initialize all events used by _tx
        m_thread.DoWork += new DoWorkEventHandler(this.Work);
        m_thread.ProgressChanged += new ProgressChangedEventHandler(this.Report);
        m_thread.RunWorkerCompleted += new RunWorkerCompletedEventHandler(this.Complete);

        //Run the backgroundworker
        m_thread.RunWorkerAsync(msg);
}

//THIS IS THE WORK FUNCTION
public override void Work(object sender, DoWorkEventArgs e)
    {
        //This code is in the TX Thread
        //The sender should be the a BackgroundWorker
        BackgroundWorker _tx = sender as BackgroundWorker;

        //Check the Argument
        if (e.Argument != null && e.Argument.GetType() == typeof(MSG))
        {
            //Transmit the Argument Message
            m_THING.Transmit((MSG)e.MSG)

            //Report progress according to the result
            _tx.ReportProgress(CONSTANTS.PROGRESS.SUCCESS_TX, (MSG)e.Argument);
        }
    }

Функция Work является переопределением, поскольку существует более высокий класс обработкичто позволяет передавать и получать, эти два наследуются от одного класса, поэтому у меня могут быть общие методы ReportProgress и Close.

...