Come creare una funzione che blocchi fino a quando non ha dati da restituire in c #

Come faccio a creare una funzione personalizzata che restituisce output e blocchi finché l’output non è disponibile? Sto pensando a qualcosa come Console.ReadLine() . Qualcosa come questo:

 var resp = Output(); //blocks until output is sent. ... //returns a string once SendOutput is called and hands over the string. public static string Output() { /* what goes here? */ } //Is this function even needed? Can I just fire Output somehow? private static string SendOutput(string msg) { /* what goes here? */ } ... //Calls sendoutput with the string to send. SendOutput(msg); 

Fondamentalmente sto facendo un ascoltatore che è bloccato fino a quando non ottiene i dati (come sarebbe se si chiamasse console.readline ), e ho bisogno del codice interno per rendere il blocco.

Quello che vuoi è che la tua chiamata al metodo di blocco venga segnalata quando altri lavori sono stati completati. A ManualResetEvent è un buon modo per ottenere questo comportamento; non ci sono loop e il ritorno è praticamente istantaneo una volta che il thread di lavoro segnala che è completo.

 class Program { static void Main(string[] args) { Blocker b = new Blocker(); Console.WriteLine(b.WaitForResult()); } } public class Blocker { private const int TIMEOUT_MILLISECONDS = 5000; private ManualResetEvent manualResetEvent; private string output; public string WaitForResult() { // create an event which we can block on until signalled manualResetEvent = new ManualResetEvent(false); // start work in a new thread Thread t = new Thread(DoWork); t.Start(); // block until either the DoWork method signals it is completed, or we timeout (timeout is optional) if (!manualResetEvent.WaitOne(TIMEOUT_MILLISECONDS)) throw new TimeoutException(); return output; } private void DoWork() { StringBuilder sb = new StringBuilder(); for (int i = 0; i < 10; i++) { sb.AppendFormat("{0}.", i); } output = sb.ToString(); // worker thread is done, we can let the WaitForResult method exit now manualResetEvent.Set(); } } 

chiamata di processo con thread e utilizzare l’operatore in background per notificare quando i dati sono disponibili.

 private void Create_Thread() { //Parameterized function Thread wt = new Thread(new ParameterizedThreadStart(this.DoWork)); wt.Start([/*Pass parameters here*/]); } public void DoWork(object data) { Thread.Sleep(1000); //Process Data - Do Work Here //Call Delegate Method to Process Result Data Post_Result(lvitem); } private delegate void _Post_Result(object data); private void Post_Result(object data) { //Process Result }