Domanda

C'è un modo elegante per sapere quando un thread di lavoro è fatto in esecuzione in modo da poter accedere alle risorse prodotta?

Per esempio, se il thread di lavoro interrogato un elenco di SQL Server utilizzando

ServersSqlDataSourceEnumerator.Instance.GetDataSources();

e salvato il risultato in una variabile DataTable, quale meccanismo posso usare per sapere quando questa variabile DataTable è stata popolata / è disponibile. Non voglio il polling ThreadState; sarebbe ideale per generare un evento quando è fatto in modo da poter eseguire le azioni con il risultato.

Grazie!

È stato utile?

Soluzione

È possibile utilizzare un meccanismo di richiamata o di un blocco su un evento per sapere di completamento di un'operazione asincrona. Vedi questa pagina per la asincrono modello di programmazione in .net -. è possibile chiamare BeginInvoke su qualsiasi delegato per eseguire l'azione in maniera asincrona

Se si sta utilizzando il tipo BackgroundWorker, è possibile iscriversi al evento RunWorkerCompleted.

Altri suggerimenti

Quindi generare un evento :-P

Si potrebbe anche guardare con un AutoResetEvent:
http://msdn.microsoft.com/en-us/ biblioteca / system.threading.autoresetevent.aspx

Quello che faccio in questo caso è ottenere il WorkerThread per chiamare una funzione, dopo aver completato il lavoro, che richiamerà il filo l'interfaccia utente, che può fare il lavoro in cui si richiede.

per es.

private void SetWorkerThreadToDoWork()
{
  WorkerThread.Start();
}

private void MyWorkerThreadWork()
{
  //This will be on the WorkerThread (called from WorkerThread.Start())
  DoWorkFunc();
  WorkComplete();
}

private void WorkComplete()
{
  if(InvokeRequired == true)
  {
    //Do the invoke
  }
  else
  {
  //Check work done by worker thread
  //e.g. ServersSqlDataSourceEnumerator.Instance.GetDataSources();
  }
}

Se si tratta di un processo semplice che si sta utilizzando, mi piacerebbe andare per un BackgroundWorkerThread, questo viene fornito con esso è di possedere gli eventi che vengono sparati quando il lavoro è completo. Ma se avete bisogno di utilizzare un thread, vorrei neanche guardare in asincrono callback o una rotta simile a quella mostrata qui sopra.

È possibile controllare la mia risposta su questo SO filo

Si utilizza un meccanismo di nuovo chiamata. Quando l'operazione asincrona è fatto, scatterà il metodo di callback in cui è possibile gestire l'elaborazione che deve essere fatto esecuzione posta SQL.

Con un approccio simile per essere avvisati quando l'operazione asincrona è fatto.

Spero che questo aiuti:)

Io non programma in C #, ma questo è quello che ho fatto con Delphi, forse si può fare anche con C #. Ho un discendente TThread, e nel caso "distruggere" mando un messaggio al suo creatore dicendo "hey sto per morire!". In questo modo suo genitore (che è il filo conduttore) crea uno nuovo se ha bisogno di una nuova. Per la precisione si lancia un timer che, quando sparò, crea un nuovo thread, se uno nuovo è necessario (siti tempo (lol) !! succhiare).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top