Вы можете использовать ManulResetEvent для этой цели: Вы запускаете свою форму ввода, а когда она это делает, задаете событие, чтобы вы могли его перехватить из метода A.dowork. Во время ввода в действии вы запускаете бесконечный цикл, проверяете состояние события и обрабатываете событие приложения, чтобы за это время приложение стало ответственным:
public class A //this is just a class file
{
private ManualResetEvent _event;
public void dowork()
{
//work 1
_event = new ManualResetEvent(false);
//INPUT = here in this ...
Worker worker = new Worker();
worker.DoInput(_event);
while(true)
{
if(_event.WaitOne())
break;
Application.DoEvents();
}
//work 2 using INPUT
}
}
class Worker
{
private ManualResetEvent _event;
public void DoInput(ManualResetEvent @event)
{
_event = @event;
// Show input form here.
// When it done, you call: _event.Set();
}
}
Кроме того, я предлагаю вам (если вы можете) использовать библиотеку Async (она доступна в качестве отдельной установки). Там вы можете реализовать это гораздо проще:
public class A //this is just a class file
{
public async void dowork()
{
//work 1
//INPUT = here in this ...
Worker worker = new Worker();
wait worker.DoInput();
//work 2 using INPUT
}
}
class Worker
{
public async void DoInput()
{
InputForm form = new InputForm();
wait form.ShowInput();
}
}
public class B
{
async void myfn()
{
A objA = new A();
wait objA.dowork();
}
}
Как вы видите, вы просто ждете, пока другой фрагмент кода будет выполнен без какой-либо блокировки пользовательского интерфейса и событий.
Я могу предоставить более глубокое объяснение того, как асинхронизация / ожидание работает здесь, если вам нужно.