Только мои 2 цента.
Я думаю, что вы можете использовать Invoke, BeginInvoke в главной форме, если вы используете Windows Forms, чтобы отправить туда исключение из блока try / catch.Или вы можете создать обработчик / делегат события в главном потоке и отправить через него исключения в основной поток, чтобы метод в главном потоке мог его обработать.Честно говоря, не пробовал эти решения, но это мои первые идеи.
PS.Может быть, создание WorkerQueue в главном потоке также вариант.Он будет работать как backgroundWorker и, когда ему будет отправлено новое исключение, обрабатывает его соответствующим образом ... Я могу привести небольшие примеры на этот счет, если вам интересно.
Редактировать:
public class JobQueue
{
private Queue<Exception> pendingJobs = new Queue<Exception>();
private Exception defaultJob = null;
bool run = true;
public void AddJob(Exception job)
{
pendingJobs.Enqueue(job);
}
public JobQueue()
{
defaultJob=null;
}
public void StopJobQueue()
{
run = false;
}
public void Run()
{
while (run)
{
Exception job = (pendingJobs.Count > 0) ? pendingJobs.Dequeue() : defaultJob;
if (job!= null)
{
////what to do with current Exception
}
Thread.Sleep(20); //I know this is bad...
}
pendingJobs.Clear();
}
}
}
Чтобы использовать его: В классе основного потока:
private JobQueue m_jobQueue;
В Initialize () или там, где начинается ваш основной поток:
Backgroundworker bw = new Backgroundworker();
bw.DoWork+= jobQueue.Run;
bw.StartAsync();
//m_jobQueue = new JobQueue();
// new Thread(new ThreadStart(jobQueue.Run)).Start();
И для отправки исключения используйте:
m_jobQueue.AddJob(StackOverflowException);
Остановка:
m_jobQueue.StopJobQueue();