【发布时间】:2016-01-06 21:17:19
【问题描述】:
我发起搜索,然后在表单中显示搜索结果。
如果我使用.Show(),表格会冻结。如果我使用.ShowDialog(),表单会显示出来,但搜索不会完成,因为在表单关闭之前控制不会返回给线程。
.ShowDialog() 方式在表单初始化后的第二次调用中起作用,因为初始化方法调用了 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;
}
【问题讨论】:
-
您的预期行为是什么?
-
很确定这个代码中不会出现“冻结”。你在 SearchForm 的构造函数中做了什么,在那个 Form_Load 事件中做了什么,最后在上面的 searchMethod 中发生了什么
-
稍后将添加更多代码,值班电话。
-
添加了更多代码。如下所述,我认为冻结是由于消息循环而发生的?不太确定那是什么,但在下面的链接中进行了讨论。
-
最后我只是在启动时预先初始化表单然后隐藏它,这似乎工作正常。克服线程问题似乎不值得麻烦。