Что касается # 3, вы не можете сделать пользовательский интерфейс напрямую из потока BackgroundWorker.Что вам нужно сделать, это запустить событие со всей необходимой информацией в аргументах события и обработать это событие в потоке пользовательского интерфейса.
Таким образом, что касается ваших окон сообщений, вы будете запускать и событие с сообщением варгументы события
public class MessageBoxEventArgs : EventArgs
{
public MessageBoxEventArgs(string message)
{
this.Message = message;
}
public string Message
{
get; private set;
}
}
Запустить событие:
public event EventHandler<MessageBoxEventArgs> Message_Event;
...
if (this.Message_Event!= null)
{
this.Message_Event(this, new MessageBoxEventArgs(message));
}
Затем обработать его:
private void MessageEventHandler(object sender, MessageBoxEventArgs e)
{
if (this.InvokeRequired)
{
this.Invoke((MethodInvoker)delegate { MessageBox.Show(e.Message); });
}
else
{
MessageBox.Show(e.Message);
}
}