Создание класса с поточно-безопасными функциями с использованием свойства InvokeRequired и метода Invoke - PullRequest
0 голосов
/ 15 марта 2012

У меня есть класс, который я создал, и в классе я делаю несколько многопоточности.Обычно для создания многопоточности в форме я использовал бы следующий метод ...

//Thread Safe Functions
delegate void Thread_Safe_SendMessage_Progress_Callback(string sProgress);
private void Thread_Safe_SendMessage_Progress(string sProgress)
{
    if (this.InvokeRequired)
    {
        Thread_Safe_SendMessage_Progress_Callback d =
            new Thread_Safe_SendMessage_Progress_Callback(Thread_Safe_SendMessage_Progress);
        try
        {
            this.Invoke(d, new object[] { sProgress });
        }
        catch
        {
            //ObjectDisposedException
        }
    }
    else
    {
        //Fire up the thread event
        SendMessageThread_Progress(sProgress);
    }
}

Теперь это работает отлично!На этом этапе я пытаюсь привнести многопоточность в класс, который я создал.Когда я делаю это, кажется, что все замечательно, за исключением свойства InvokeRequired, и метод Invoke не существует в моем классе.Поэтому использование this.InvokeRequired выдает ошибку ... Чтобы дать моему классу это свойство, я делаю это ... (Обратите внимание, что m_iThreadID устанавливается в конструкторе и когда поток создается для запуска с)

private bool InvokeRequired
{
    get
    {
        //Get the current thread id
        int iThreadID = System.Threading.Thread.CurrentThread.ManagedThreadId;

        //Compare and return results
        return (iThreadID != m_iThreadID);
    }
}

Теперь осталось только метод Invoke ... Как мне заставить это работать?

1 Ответ

0 голосов
/ 15 марта 2012

Invoke метод не так "прост" для копирования (дополнительный вопрос: почему бы вам не использовать BeginInvoke? Я думаю, вам может не потребоваться синхронно вызывать событие). Вы можете получить первую форму в Application.OpenForms (скопировать перед использованием!) И проверить, чтобы проверить на InvokeRequired и BeginInvoke/Invoke.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...