我发起搜索,然后在表单中显示该搜索的结果。
如果我使用.Show()
表单冻结。如果我使用.ShowDialog()
表单显示,但搜索未完成,因为在表单关闭之前,控件不会返回给线程。
初始化表单后,.ShowDialog()
方式适用于第二次调用,因为initialize方法调用else激活代码。但是我希望这可以在第一次电话会议上工作。
代码如下。
public static void Search(string searchstring)
{
IntializeSearchResultsForm()
List<searchitem> templist = searchmethod(searchstring);
SearchForm.Invoke((MethodInvoker) (() => SearchForm.SetSearchResultsData(tempList)));
}
public static void IntializeSearchResultsForm()
{
if (SearchForm == null)
{
SearchForm = new SearchForm();
SearchForm.Show(); OR SearchForm.ShowDialog();
}
else
{
SearchForm.Invoke(new MethodInvoker(SearchForm.Activate));
}
}
更新更多代码详细信息:
public static List<PricerSearchResultEntry> searchmethod(string dealID)
{
List<PricerSearchResultEntry> tempResultsList = new List<PricerSearchResultEntry>();
foreach (String dir in pricerFolderArray)
{
if (Directory.Exists(dir))
{
string[] filesList = Directory.GetFiles(dir, "*" + dealID + "*");
foreach (String file in filesList)
{
if (AppContext.SearchPricersForm.PricersCheckBox)
{
if (file.Contains("pricer") && !file.Contains("Failed") && !file.Contains("Incomplete"))
{
tempResultsList.Add(ParseFileString(file));
}
}
}
}
}
tempResultsList.Sort((x, y) => y.ValuationDate.CompareTo(x.ValuationDate));
return tempResultsList;
}
public SearchForm()
{
InitializeComponent();
searchResultsListBox.DisplayMember = "Title";
searchResultsListBox.ValueMember = "DealID";
searchResultsListBox.DataSource = searchResultsList;
}
答案 0 :(得分:3)
如果我使用
.Show()
表单冻结
这表示您的计算使用了阻止代码。您需要使用非阻塞算法(例如async
/ await
)来允许GUI处理消息,或者在后台(也称为helper aka worker)线程上进行计算。