Вы можете сделать это следующим образом:
В Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Threading;
namespace TwoWindows
{
static class Program
{
public static Form1 form1;
public static Form2 form2;
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
form1 = new Form1();
form2 = new Form2();
form1.Form2Property = form2;
form2.Form1Property = form1;
form1.Show();
form2.Show();
Application.Run();
}
}
}
В Form1.cs:
namespace TwoWindows
{
public partial class Form1 : Form
{
public Form2 Form2Property { get; set; }
public Form1()
{
InitializeComponent();
}
protected override void OnClosed(EventArgs e)
{
if (Form2Property.IsDisposed)
Application.Exit();
}
}
}
И Form2.cs:
namespace TwoWindows
{
public partial class Form2 : Form
{
public Form1 Form1Property { get; set; }
public Form2()
{
InitializeComponent();
}
protected override void OnClosed(EventArgs e)
{
if (Form1Property.IsDisposed)
Application.Exit();
}
}
}
Таким образом, вы можете получить две формы в одном потоке и использовать одну для управления другой.Если вам нужно использовать потоки, я бы предложил использовать выделенные потоки, которые являются частью классов, а не порождать метод, который можно вызывать более одного раза.Затем используйте ManualResetEvent или AutoResetEvent для управления обработкой потока.Мне очень нравится подход использования чего-то подобного, потому что это безопасно и не тратит много ресурсов на инициализацию потоков.
public class MyClassOrForm
{
Thread myProcessingThread;
public AutoResetEvent startProcessing = new AutoResetEvent(false);
public AutoResetEvent processingFinished = new AutoResetEvent(false);
public AutoResetEvent killProcessingThread = new AutoResetEvent(false);
public MyClassOrForm()
{
myProcessingThread = new Thread(MyProcess);
}
private void MyProcess()
{
while (true)
{
if (startProcessing.WaitOne())
{
// Do processing here
processingFinished.Set();
}
if (killProcessingThread.WaitOne(0))
return;
}
}
}
Затем, после того как вы настроили данные для обработки, вызовите другой класс илиmethod
MyClassOrMethodInstance.startProcessing.Set();
И если вам нужно дождаться окончания обработки, вставьте:
MyClassOrMethodInstance.processingFinished.WaitOne(time_out_ms);
Это эквивалентно вызову Thread.Join (), только то, что у вас неткаждый раз выделять другой поток с учетом рисков, связанных с потоками, если они зависят от локальных данных или незавершенных дочерних потоков.