Как сделать так, чтобы метод вызванный из нового потока выполнялся в основном - C#

Узнай цену своей работы

Формулировка задачи:

Вот есть код, специально всё скопировал в новый проект и упростил, чтобы была только идея понятна и компилировалось. Как сделать так, чтобы событие отрабатывало в том потоке, в котором на него подписались и чтобы сразу поток инициировавший событие продолжил работу, а не ждал пока обработает событие основной поток? В моём коде это метод s_ParsingCompleted.
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Threading.Tasks;
 
namespace ConsApp_ParallelForEach
{
    class Program
    {
        static void Main(string[] args)
        {
            Something s = new Something();
            s.ParsingCompleted += new EventHandler<ParsingCompletedEventArgs<string>>(s_ParsingCompleted);
            s.DoWork();
        }
 
        static void s_ParsingCompleted(object sender, ParsingCompletedEventArgs<string> e)
        {
            //Как код находящийся тут выполнить в основном потоке
        }
    }
 
    public class ParsingCompletedEventArgs<T> : EventArgs
    {
        public IEnumerable<T> ParsingResult { get; protected set; }
 
        public ParsingCompletedEventArgs(IEnumerable<T> parsingResult)
        {
            ParsingResult = parsingResult;
        }
    }
 
    class Something
    {
        public void DoWork()
        {
            new Task(() =>
            {
                ParallelOptions parOpt = new ParallelOptions();
                ConcurrentQueue<string> infos = new ConcurrentQueue<string>();
 
                Action<string, ParallelLoopState> body = (site, pLoopState) =>
                {
 
                };
 
                ParallelLoopResult res = Parallel.ForEach(new string[] { "", "" }, parOpt, body);
                if (res.IsCompleted)
                    OnParsingCompleted(infos);
            }).Start();
        }
 
        public event EventHandler<ParsingCompletedEventArgs<string>> ParsingCompleted;
 
        private void OnParsingCompleted(IEnumerable<string> result)
        {
            if (ParsingCompleted != null)
                ParsingCompleted(this, new ParsingCompletedEventArgs<string>(result));
        }
    }
}

Решение задачи: «Как сделать так, чтобы метод вызванный из нового потока выполнялся в основном»

textual
Листинг программы
App._mainWnd.addmessage (new Msg ("parsingEnd", ...));
// и дальше пошел. а главное окно обрабатывает (у меня на этот случай, 
//правда, еще один обработчик есть, чтоб не все в окно тулить, но это детали, 
// он все равно в потоке окна работает
//каждый делает как ему удобно или просто нравится)

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.333 из 5
Похожие ответы