Form.Show冻结窗口,Form.ShowDialog阻止执行。我还有其他选择吗?

时间:2016-01-06 21:17:19

标签: c# .net forms winforms

我发起搜索,然后在表单中显示该搜索的结果。

如果我使用.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;
    }

1 个答案:

答案 0 :(得分:3)

  

如果我使用.Show()表单冻结

这表示您的计算使用了阻止代码。您需要使用非阻塞算法(例如async / await)来允许GUI处理消息,或者在后台(也称为helper aka worker)线程上进行计算。