Nano Hash - криптовалюты, майнинг, программирование

Синхронный вызов BackgroundWorker

Я хочу вызвать фонового работника синхронно. Я хочу, чтобы выполнение кода завершилось, когда фоновый рабочий завершил его выполнение. Мой код для BackgroundWorker находится здесь:

{
    BackgroundWorker worker = new BackgroundWorker();
    worker.DoWork += DoWork;
    worker.RunWorkerCompleted += RunWorkerCompleted;
    ...
    worker.RunWorkerAsync();
    //wait for execution to end 
}

Один из способов сделать это - снова проверить статус n снова, пока его выполнение не будет завершено, но есть ли другой хороший способ сделать это?

31.08.2012

  • Какой смысл использовать BackgroundWorker, если вы синхронно ждете его? 31.08.2012
  • Почему бы просто не переместить часть кода, которую вы хотите выполнить после завершения BackgroundWorker, в событие RunWorkerCompleted? 31.08.2012
  • код, который я хочу выполнить, дает ошибку при выполнении в том же потоке, поэтому мне нужно, чтобы этот код запускался через фонового рабочего. 31.08.2012
  • @AhmedMasud: вам следует сосредоточиться на исправлении этой ошибки, а не на создании обходных путей. 31.08.2012
  • @KooKiz - для начала, асинхронный фоновый рабочий не будет блокировать пользовательский интерфейс. Кроме того, OP может захотеть выполнить некоторые другие промежуточные шаги, но решил не показывать эти шаги в примере. 31.08.2012
  • @ChrisGessler Но если вы синхронно дождетесь завершения фоновой работы, вы все равно заблокируете пользовательский интерфейс. 31.08.2012
  • Какую версию С# вы используете? 4? 4,5? 5? 31.08.2012
  • @KooKiz - не обязательно. msdn.microsoft.com/en-us/library/hh191443.aspx 31.08.2012
  • @ChrisGessler Асинхронное программирование с помощью Async и Await, как это синхронно? ;) 31.08.2012
  • @ChrisGessler: await не выполняет синхронное ожидание. Это просто похоже на синхронный код... 31.08.2012
  • @ChrisGessler: C# 4.5 не существует. Есть C# 4, C#5 и .NET 4 и .NET 4.5. Не путайте тех. 31.08.2012
  • Я использую этот код в службе wcf, поэтому здесь не будет проблем с пользовательским интерфейсом, и я использую .NET 3.5. 31.08.2012
  • @ChrisGessler: Вы задействовали это, сказав, что синхронное ожидание завершения фонового рабочего процесса не обязательно блокирует пользовательский интерфейс и ссылается на введение в await и async. 31.08.2012
  • @DanielHilgarth - ОП (и другие) использовали слово «синхронный», а не я. Я просто пытаюсь угадать, что действительно нужно / хочет ОП, несмотря на выбранное слово. В исходном вопросе не упоминается пользовательский интерфейс, служба Windows и т. д., поэтому трудно понять, какую проблему я действительно пытаюсь решить, как и во многих из этих вопросов SO, поэтому иногда необходимо читать между строк. Если асинхронное/синхронное ожидание не имеет большого значения, проблема может быть решена несколькими способами, тогда как синхронное ожидание ограничивает возможности. 31.08.2012
  • @DanielHilgarth - На самом деле C # 4.5 существовал в течение очень короткого времени, по крайней мере, так все называли его до официального объявления Microsoft. Но вы правы, на самом деле это был C# 4 + .NET 4.5. Я думаю, что люди назвали его так, потому что это было проще сказать, чем C# 4 с использованием компилятора .NET 4.5. dotnetcurry.com/ShowArticle.aspx?ID=797 31.08.2012

Ответы:


1

Если вы не хотите, чтобы ваш код выполнялся асинхронно, не помещайте его в BackgroundWorker...

{ 
    DoWork();
} 

Однако, если есть какая-то неясная причина, по которой вам абсолютно необходимо иметь код в BackgroundWorker, вы можете использовать следующее:

ManualResetEvent mre = new ManualResetEvent(false);
BackgroundWorker worker = new BackgroundWorker(); 
worker.DoWork += DoWork; 
worker.RunWorkerCompleted += (s, e) => 
                             {
                                 RunWorkerCompleted(s, e); 
                                 mre.Set();
                             };
// ... 
worker.RunWorkerAsync();
mre.WaitOne();
31.08.2012

2

Цель: BackgroundWorker должен выполняться синхронно.

Создал форму приложения Windows. При нажатии кнопки 1 он должен выполнять BackgroundWorker синхронно и возвращаться к пользовательскому интерфейсу, поэтому пользователь не может ничего делать до завершения задачи BackgroundWorker.

public partial class Form1 : Form 
{ 

    public Form1() 
    { 
        InitializeComponent(); 
    }

    BGimplent obj = null;

    private void button1_Click(object sender, EventArgs e)
    {
        int i = 0;
         obj = new BGimplent();
        obj.eveBG += obj_eveBG;
        i = 5;
        obj.MyProperty = 5;
        obj.DoConfig();
        obj.ManualReset.WaitOne();

        obj.MyProperty = 10;
        obj.MyProperty = 11;
        obj.MyProperty = 12;
        obj.MyProperty = 13;

        obj.MyProperty = 14;
    }

    void obj_eveBG(string s)
    {
        obj.ManualReset.Set();
        MessageBox.Show(s);
    }
}



/*
*******************************************************
    Paste below code in adding new class i.e. Class1


*/
public delegate void delBG(string s);

class BGimplent
{
    public event  delBG eveBG;


    private ManualResetEvent mnuReset = new ManualResetEvent(false);
    public ManualResetEvent ManualReset { get; set; }

    public int MyProperty { get; set; }

    BackgroundWorker bgWorker = new BackgroundWorker();
    public void DoConfig()
    {
        ManualReset = mnuReset;

        bgWorker.DoWork += bgWorker_DoWork;
        bgWorker.ProgressChanged += bgWorker_ProgressChanged;
        bgWorker.RunWorkerCompleted += bgWorker_RunWorkerCompleted;
        bgWorker.RunWorkerAsync();            
    }

    void bgWorker_DoWork(object sender, DoWorkEventArgs e)
    {   
        Thread.Sleep(5000);
        if (eveBG != null)
            eveBG("Value of MyProperty: " + MyProperty.ToString());
    }

}
31.08.2017
  • @GhostCat да, ты прав. Я старался изо всех сил ответить на вопрос через мой пост. 08.09.2017
  • @GhostCat спасибо за совет, я отредактировал код и попытался представить его более привлекательным. 12.09.2017
  • Я бы еще больше сократил пустые тела методов - но теперь намного лучше ;-) 12.09.2017

  • 3

    Ваш код, который будет после //wait for execution to end, должен быть помещен в метод worker_RunWorkerCompleted.

    21.01.2015
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..