Tela inicial esperando até que a linha termine

Eu ainda tenho um problema com a canvas inicial. Eu não quero usar a propriedade SC.TopMost=true .

Agora meu cenário de aplicativo é o seguinte:

em progeram.cs:

 [STAThread] static void Main() { new SplashScreen(_tempAL);// where _tempAL is an arrayList Application.Run(new Form1(_tempAL)); } 

na class SplashScreen:

 public SplashScreen(ArrayList _Data) { DisplaySplash() } private void DisplaySplash() { this.Show(); this.TopMost = true; this.CenterToScreen(); this.SetTopLevel(true); _allServerNarrators = new string[10]; for (int i = 0; i < _allServerNarrators.Length; i++) _allServerNarrators[i] = null; GetFromServer(); this.Hide(); _serverData = new ArrayList(); _thisData.Add(_allServerNarrators); _thisData.Add(_serverNarrators); } private void GetFromServer() { _serverNarrators = new ArrayList(); string _file = "Suras.serverNar"; if (!Directory.Exists("c:\\ASGAQuraan")) Directory.CreateDirectory("c:\\ASGAQuraan"); while (counter  0 && ind < _line.Length) { string str = _line.Substring(0, (ind)); if (k == 0) { _allServerNarrators[_narId] = str; _serverNarratorNode.Add(str); } else { _serverNarratorNode.Add(str); } _line = _line.Substring(ind + 1); k++; } else { _line = null; break; } } _serverNarrators.Add(_serverNarratorNode); _serverFiles = "added"; } _line = _strReader.ReadLine(); if (_line == null) { break; } } } else counter++; } } 

O que eu quero é algo na class de canvas inicial que aguarda até o segmento terminar.

Para mais detalhes, por favor me diga o que eu preciso te contar.

Seguir através de 2 threads é um pouco confuso, mas vou pegar uma facada e dizer isso …

Eu não entendo completamente seu design aqui, mas se o problema é que quando você inicia um segundo aplicativo, o formulário da canvas inicial fica branco … É mais provável que ele esteja ocupado executando todo esse código em GetFromServer () Tão ocupado que não tem tempo para se pintar novamente.

Para solucionar esse problema, sugiro que você use o componente BackGroundWorker para executar o método GetFromServer. Isso executará esse método em um thread separado e deixará o thread do formulário livre para pintar novamente.

Mesma pergunta, mesma resposta:

O .NET framework tem excelente suporte interno para canvass iniciais. Inicie um novo projeto WF, Project + Add Reference, selecione Microsoft.VisualBasic. Adicione um novo formulário, chame-o de frmSplash. Abra o Project.cs e faça com que seja assim:

 using System; using System.Windows.Forms; using Microsoft.VisualBasic.ApplicationServices; namespace WindowsFormsApplication1 { static class Program { [STAThread] static void Main(string[] args) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); new MyApp().Run(args); } } class MyApp : WindowsFormsApplicationBase { protected override void OnCreateSplashScreen() { this.SplashScreen = new frmSplash(); } protected override void OnCreateMainForm() { // Do your time consuming stuff here... //... System.Threading.Thread.Sleep(3000); // Then create the main form, the splash screen will close automatically this.MainForm = new Form1(); } } } 

Você inseriu um território perigoso criando uma interface do usuário antes de sua chamada para Application.Run (). Application.Run é essencialmente a bomba de mensagens do seu programa. Ao exibir a interface do usuário antes de iniciar a bomba de mensagens do aplicativo, você torna a interação típica da interface do usuário efetivamente impossível na interface do usuário prematura. Para uma canvas inicial, isso pode não parecer relevante, mas será importante se (por exemplo) houver uma solicitação para que a canvas inicial desapareça caso seja clicada, ou se você quiser usar um BackgroundWorker.

Isso pode ser contornado criando uma bomba de mensagens em sua canvas inicial (tornando-a modal por meio de uma chamada para ShowDialog () em vez de Show ()), mas tratar o sintoma ao tratar o problema realmente não é tão difícil.

Eu encorajaria fortemente a resposta do nobugz neste caso. O framework fornece o suporte de que você precisa. Embora os resources no namespace Microsoft.VisualBasic nem sempre sejam muito detectáveis ​​pelos programadores C #, eles podem economizar tempo e economizar resources para casos como esse.

Boa sorte!

Você realmente deve dar mais detalhes sobre o seu problema. Eu posso estar completamente errado, mas vou dar um tiro no escuro. Pelo que estou imaginando está acontecendo e você quer, você quer que a canvas inicial apareça, faça algum processamento em outro thread e, em seguida, a canvas inicial desapareça quando terminar.

Para fazer isso, você vai querer mover a chamada GetFromServer() para um BackgroundWorker . Então mova o

  this.Hide(); _serverData = new ArrayList(); _thisData.Add(_allServerNarrators); _thisData.Add(_serverNarrators); 

código para o manipulador de events BackgroundWorker_RunWorkerCompleted .

Para usar o BackgroundWorker :

1) Inicialize o BackGroundWorker

  BackgroundWorker myWorker = new BackgroundWorker(); 

2) Adicionar manipuladores de events

  myWorker.DoWork += new DoWorkEventHandler(myWorker_DoWork); //put the work you want done in this one myWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(myWorker_RunWorkerCompleted); //this gets fired when the work is finished 

3) Adicione código aos manipuladores de events.

4) Ligue para myWorker.RunWorkerAsync() para começar a trabalhar.

Como uma nota separada, você não parece estar fazendo nada com o ArrayList que está passando para o construtor da canvas inicial. Isso é pretendido?

Infelizmente eu não tenho reputação suficiente para comentar sobre alguém responder ainda. 🙁 Esta é a resposta para o Coronel Panics comentar a resposta de Hans Passants .

Seu problema era que um MessageBox mostrado a partir de um new FormMain(args) seria mostrado por trás da canvas inicial. A chave é invocar o MessageBox do encadeamento em que a canvas inicial é executada:

 splashScreen.Invoke(new Action(() => { MessageBox.Show(splashScreen, "the message"); })); 

Onde splashScreen é uma referência para o object de canvas inicial que foi criado no OnCreateSplashScreen e obviamente tem que ser dado ao novo object Form1 .