【问题标题】:Form.Show freezes window, Form.ShowDialog blocks execution. What other options do I have? [closed]Form.Show 冻结窗口,Form.ShowDialog 阻止执行。我还有什么其他选择? [关闭]
【发布时间】: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 中发生了什么
  • 稍后将添加更多代码,值班电话。
  • 添加了更多代码。如下所述,我认为冻结是由于消息循环而发生的?不太确定那是什么,但在下面的链接中进行了讨论。
  • 最后我只是在启动时预先初始化表单然后隐藏它,这似乎工作正常。克服线程问题似乎不值得麻烦。

标签: c# .net forms winforms


【解决方案1】:

如果我使用.Show(),表格会冻结

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

【讨论】:

  • 我认为情况并非如此。搜索算法中没有阻塞代码,超级简单。我认为这个问题/答案解释了为什么 .show() 冻结了 GUI。 stackoverflow.com/questions/11420717/…
  • @Hardycore,你的意思是你试图在调用Application.Run()之外的控制台应用程序中运行Show()
  • @Hardycore:“非常简单”几乎可以保证 is 阻塞代码。默认情况下,代码不会控制消息循环,它需要一些努力将其拆分为可以单独await-ed 的步骤。
  • 将很快添加搜索代码和表单初始化代码。
  • 我已经非常彻底地追踪了它,我很确定搜索和构造函数没有阻塞。如果它们是,那么 .showdialog() 案例也不会起作用吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多