我得到的是类似OpenFileDialog.Show()方法的东西,它在无限期的时间后返回,只有在用户做某事之后(在这种情况下按Ok)。好吧,我知道我可以通过从对话框,表单或类似的东西中进行子类化来实现对话框控件的类似功能。但是,如果我想做一些与对话完全无关的事情,例如我想编写一个方法InputStringToTextbox(),只有在用户在表单上的文本框中输入合法字符串并按Enter键后才会返回。
我确实对线程和C#的BeginInvoke / EndInvoke的概念有一些基本的了解,但我不太明白如何将这些想法应用于这种特定的情况。
答案 0 :(得分:4)
如果您需要阻止线程,请参阅ManualResetEvent和AutoResetEvent类。这些是基本的同步类型,不带有Monitor类型的额外包袱,事实上,许多.NET同步类型都建立在它们之上。
以下是一个简短的示例,演示了您提供的上下文的用法。
static class ThreadEntryPoints
{
public static Main()
{
ShowDialog();
}
public static Other_Main()
{
// ... do some work ...
_event.Set();
}
private static ShowDialog()
{
// ... do some work ...
_event.WaitOne(/* optionally set timeout */);
}
private static readonly ManualResetEvent _event = new ManualResetEvent(false);
}
答案 1 :(得分:2)
你可以实现一个等待事情发生的方法。
void MainMethod()
{
...
...
DoSomethingAndWait()
...
}
private void DoSomethingAndWait()
{
...
...
while(!somethingHappened) //updated by other thread
{
Thread.Sleep(100) ;
}
...
}
答案 2 :(得分:-1)
您引用的方法有效,因为它调用的.NET API在用户事件发生之前不会返回。你可以做类似的事情。
答案 3 :(得分:-1)
假设WinForms:
如果要确保UI不挂起,则需要确保在等待循环中调用Application.DoEvents()。如果您不这样做,UI将冻结。