2016-01-06 2 views
-1

Я инициирую поиск, а затем покажу результаты этого поиска в форме.Form.Show freezes window, Form.ShowDialog блокирует выполнение. Какие у меня есть другие варианты?

Если я использую .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)); 
    } 
} 

UPDATE с большим количеством деталей кода:

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

Какое у вас ожидаемое поведение? –

+0

Довольно уверен, что в этом коде не происходит «замораживания». Что вы делаете в конструкторе SearchForm, что в этом событии Form_Load и, наконец, что происходит в _searchMethod_ выше – Steve

+0

Вскоре добавит код, дежурные звонки. – Hardycore

ответ

3

Если я использую .Show() форма застывает

Это указывает на то, что ваш расчет использует блокирующую код. Вам нужно либо использовать неблокирующий алгоритм (например, async/await), чтобы позволить графическому интерфейсу обрабатывать сообщения, или делать расчет на фоне (aka helper aka worker) thread.

+0

Я не верю, что это так. В поисковом алгоритме нет кода блокировки, его супер просто. Я думаю, что этот вопрос/ответ объясняет, почему .show() замораживает GUI. http://stackoverflow.com/questions/11420717/form-show-called-from-a-console-freezes-the-gui – Hardycore

+0

@ Hardycore, вы имеете в виду, что пытаетесь запустить 'Show()' в консоли приложение за пределами вызова 'Application.Run()'? – adv12

+1

@ Hardycore: «Это супер просто» почти гарантирует, что это ** - код блокировки. Код не приводит к управлению циклом сообщения по умолчанию, он требует некоторых усилий, чтобы разбить его на шаги, которые могут быть индивидуально 'await'-ed. –

Смежные вопросы