la risposta si verifica in un thread separato. Le Winform non sono multi-thread safe, quindi dovrai inviare la chiamata sullo stesso thread del modulo.
È possibile farlo utilizzando il ciclo di messaggi interno della finestra. Fortunatamente, .NET offre un modo per farlo. È possibile utilizzare i metodi Invoke o BeginInvoke del controllo per eseguire questa operazione. Il primo blocca il thread corrente fino a quando il thread UI completa il metodo invocato. Più tardi lo fa in modo asincrono. A meno che non ci sia la pulizia da fare, è possibile utilizzare quest'ultimo per "accendere e dimenticare"
Per far sì che funzioni in entrambi i casi, è necessario creare un metodo che viene richiamato da BeginInvoke e che è necessario un delegato per indicare quel metodo.
Vedere Control.Invoke e Control.BeginInvoke nel MSDN per ulteriori dettagli.
C'è un campione a questo link: https://msdn.microsoft.com/en-us/library/zyzhdc6b(v=vs.110).aspx
Aggiornamento: Come sto navigando il mio profilo perché ho dimenticato ho avuto un account qui - ho notato questo e devo aggiungere: Tutto passato, 3,5 o quando in modo significativo cambiato il modello di threading asincrono qui è fuori dalla mia timoneria. Sono fuori professionalmente, e mentre amo ancora il mestiere, non seguo ogni progresso. Quello che posso dirti è che questo dovrebbe funzionare in tutte le versioni di .NET ma potrebbe non essere l'assoluto apice delle prestazioni 4.0 e successive o sull'emulazione Mono/Winforms se è ancora in circolazione. Sul lato positivo, qualsiasi hit di solito non sarà negativo al di fuori delle app del server e persino all'interno se il threadpool sta facendo il suo lavoro. Quindi non concentrare gli sforzi di ottimizzazione qui nella maggior parte dei casi, ed è più probabile che si lavori su piattaforme "spogliate" che si vedono eseguire cose come i pacchetti mobili C# anche se dovrei cercare di essere sicuro e la maggior parte non esegue winforms ma alcuni giri di messaggi e questo funziona anche lì. Fondamentalmente alla linea di fondo, non è la "migliore risposta" per le piattaforme più recenti in ogni caso. Ma potrebbe essere più portatile nel caso giusto. Se ciò aiuta una persona a evitare di fare un errore di progettazione, allora è valsa la pena il tempo che ho impiegato per scrivere questo. =)
fonte
2015-12-26 02:24:21
Che cos'è il parametro IAsyncResult nel secondo metodo? Risultato della richiesta di chiamata.BeginGetResponse()? – demas
Come vedo io non cambia nulla. Ecco il codice completo http://pastebin.com/trvq1qza. Windows GUI congelare sulla linea 18. – demas
@demas ho aggiornato la risposta. –