Я бы предложил добавить интерфейс, реализовать этот интерфейс в вашем пользовательском интерфейсе и передать ссылку на класс, который реализует интерфейс, в ваши новые классы.
Этот подход должен работать, если вы выполняете работу в одном потоке или нескольких потоках.
Например, интерфейс:
public interface INotify
{
void Notify(string Msg);
}
пользовательский интерфейс:
public class Form1 : INotify
{
// This is the method where you instantiate the new worker process
public void DoSomeWork() {
NewClass Worker = New NewClass(this);
}
public delegate void NotifyDelegate(string Msg);
public void Notify(string Msg)
{
txtLog.Text += Msg + Environment.NewLine;
}
void INotify.Notify(string Msg)
{
this.INotify_Notify(Msg);
}
private void INotify_Notify(string Msg)
{
if (this.InvokeRequired)
{
this.Invoke(new NotifyDelegate(Notify), Msg);
}
else
{
this.Notify(Msg);
}
}
}
и новый класс (просто позвоните notify в этом классе, чтобы отправить сообщение):
public class NewClass
{
private INotify m_Notifier;
private void Notify(string Msg)
{
m_Notifier.Notify(Msg);
}
public NewClass(INotify oNotifier)
{
m_Notifier = oNotifier;
}
}
Обновление с альтернативной реализацией
Альтернативной реализацией, которая будет работать со статическими классами, является реализация делегата.
Например, вот делегат:
public delegate void NotifyDelegate(string Msg);
Вот пример статического класса для консольного приложения:
static class Program
{
private static NotifyDelegate m_Notifier;
static void Main(string[] args)
{
m_Notifier = new NotifyDelegate(Notify);
NewClass oNewClass = new NewClass(m_Notifier);
// Your work code here
}
static void Notify(string Msg)
{
Console.WriteLine(Msg);
}
}
и пересмотренный вариант рабочего класса:
public class NewClass
{
private NotifyDelegate m_Notifier;
public void Notify(string Msg)
{
m_Notifier.Invoke(Msg);
}
public NewClass(NotifyDelegate oNotifier)
{
m_Notifier = oNotifier;
}
}