Как сделать так, чтобы метод вызванный из нового потока выполнялся в основном - 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", ...));
// и дальше пошел. а главное окно обрабатывает (у меня на этот случай,
//правда, еще один обработчик есть, чтоб не все в окно тулить, но это детали,
// он все равно в потоке окна работает
//каждый делает как ему удобно или просто нравится)