Какая из этих функций наиболее эффективна? - PullRequest
4 голосов
/ 16 января 2012

При использовании потока «invoke» используется, чтобы избежать «Cross Thread» (1)

, но иногда «объект таймера» используется, чтобы избежать «CrossThread» (2)

вот так (например)

public partial class Form1 : Form
{

    private bool bCheckState = false;

    public Form1()
    {
        InitializeComponent();
    }

    //Button Click
    private void btnWork_Click(object sender, EventArgs e)
    {
        Thread m_Thread = new Thread(new ThreadStart(Work));
        m_Thread.Start();

    }

    private void Work()
    {
        bCheckState = true;            
        // not use invoke 
    }


    private void timer_Tick(object sender, EventArgs e)
    {
        if (bCheckState)
        {
            //tbxDisplay is winform's textBox control - printing data
            tbxDisplay.Text = bCheckState.ToString();
            bCheckState = false;
        }
    }
}

какой из них более эффективен?'Между (1) и (2)'


Может ли быть проблемой, если мы разберем данные, обработанные в «потоке», после проверки их в «событии таймера», без использования «invoke» илидругие методы?(Мы слышали, что во избежание «перекрестного потока» при печати данных, обработанных в «потоке», разбрасывание данных в «событии таймера» с дополнительным «объектом таймера» использовалось довольно часто, поскольку это ни полезно, ни вредно).

Ответы [ 2 ]

5 голосов
/ 16 января 2012

Просто используйте экземпляр BackgroundWorker и обработайте события ReportProgress и / или RunWorkerCompleted, которые уже находятся в нужном потоке.

1 голос
/ 17 января 2012

Как предположил Бен Фойгт, BackgroundWorker - это, вероятно, то, что вы должны использовать здесь, если у вас нет веских оснований хотеть использовать что-то еще.

«Эффективный» - довольно смутное средство сравнения. Не совсем понятно, что вы ищете в двух вариантах, которые вы рассматриваете.

BackgroundWorker s просты и понятны, и они избегают использования таймеров.

Invoke более эффективен, чем таймер, в том смысле, что будет меньше задержки между достижением bCheckState истины и обновлением текста. Он также будет менее ресурсоемким, поскольку у вас не будет опроса таймера через заданный интервал.

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

В качестве другой альтернативы, BeginInvoke может использоваться для обновления формы без использования таймера и без необходимости в потоке, ожидающем завершения вызова. Тем не менее, если возникнет исключение, ваш поток может не выяснить, если вы не вызовете EndInvoke, что также остановит выполнение потока до завершения вызова.

Все они имеют свои преимущества и недостатки, и вы не можете назвать какой-то конкретный более "эффективным" в целом.

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