[C#] Form principale si blocca mentre un altro Thread lavora

race

Nuovo Utente
10 Ott 2020
18
0
1
Buongiorno,
ho fatto un programmino in "Win Form" con Visual Studio 2019.

Questo programmino posta sui gruppi Facebook tramite "Selenium + Chrome Driver", quindi apre un Browser e simula tutti i passaggi umani.

Ho fatto il "Form1" quindi l'interfaccia utente dove si realizza il post e si seleziona i gruppi dove postare,
attraverso un nuovo Thread avvio una nuova istanza di "Chrome Driver", quindi mi si apre il browser e inizia tutte le procedure, login, post, etc...

Avviandolo da Visual Studio per fare delle prove brevi su 5 gruppi con intervalli di 3 minuti tra i post tutto funziona correttamente.

Quando faccio delle prove più lunghe, tipo alcune ore e con intervalli da 30 minuti tra i post, lo ritrovo con questo errore:

Codice:
Assistente al debug gestito 'ContextSwitchDeadlock' : 'CLR non è riuscito a passare dal contesto COM 0x7b3e00 al contesto COM 0x7b3d48 per 60 secondi. Probabilmente il thread a cui appartiene il contesto/apartment di destinazione è impegnato nell'attesa senza distribuzione o nell'elaborazione di un'operazione a esecuzione prolungata che non prevede la distribuzione di messaggi Windows. Questa situazione in genere ha un impatto negativo sulle prestazioni e può causare una mancata risposta dall'applicazione o un accumulo continuato nel tempo dell'utilizzo della memoria. Per evitare questo problema, è necessario che durante le operazioni a esecuzione prolungata tutti i thread di tipo apartment a thread singolo usino primitive di attesa con distribuzione (ad esempio CoWaitForMultipleHandles) e messaggi distribuiti in base a routine.'

Inoltre un altro dettaglio:
se entro nella cartella del progetto e lo avvio direttamente dall'exe, si apre il programma, lancio il ciclo dei post, poi clicco su un altra finestra in modo da fare perdere il "fuoco" al Form1, mi appare immediatamente la classica scritta di "frizz": (il programma non risponde).

Posto una breve porzione di codice per fare capire come gestisco il programmino:

Codice:
static readonly WebReference.IBot wsIBot = new WebReference.IBot();
private readonly Browser oBrowser = new Browser(wsIBot );

public Form1()
        {
           InitializeComponent();
           
           CheckForIllegalCrossThreadCalls = false;
        }
     
     
[Obsolete]
private void BtnLogin_Click(object sender, EventArgs e)
{
   th = new Thread(new ThreadStart(Login))
   {
      ApartmentState = ApartmentState.STA
   };
}
th.Start();

private void Login
{
    pbLogin.Minimum = 0;
    pbLogin.Value = 0;
    pbLogin.Step = 1;
    pbLogin.Maximum = 8;
    
    oBrowser.UrlLogin = UrlLogin;
    
   oBrowser.OpenBrowser(PrograssBar1);
}


Codice:
class Browser : File
    {
        WebReference.myRef wsRef;
        private dynamic UrlLogin { get; set; } = null;
        private ChromeDriverService service;
        private string UrlLogin = "https://m.facebook.com/login";

        public Browser(WebReference.myRef _wsRef)
        {
            wsIBot = _wsIBot;
        }
     }
        
        public void OpenBrowser(ProgressBar _Pb)
        {
            service = ChromeDriverService.CreateDefaultService();

            //Nascondo la Console
            service.HideCommandPromptWindow = true;

            //Disabilito:
            ChromeOptions options = new ChromeOptions
            {
                PageLoadStrategy = PageLoadStrategy.Normal
            };
            options.AddArguments("--window-size=300,950");
            options.AddArguments("--disable-extensions"); //extension
            options.AddArguments("--disable-notifications"); //notification (PopUp "Notifiche" di Chrome)
            options.AddArguments("--disable-application-cache"); //cache

            driver = new ChromeDriver(service, options);

            driver.Navigate().GoToUrl(UrlLogin.URL_NavigateTo.ToString());

            _Pb.PerformStep();
        }

Questo è una piccola parte del codice.
Mi chiedo:
- non sarà perchè cerco di gestire una ProgressBar su Form1 da un altro Thread?
---> oBrowser.OpenBrowser(PrograssBar1);

- oppure perche passo dei vlaori a delle Propertyes da Form1 alla classe Brovser su un nuovo thread?
---> oBrowser.UrlLogin = UrlLogin;

Non so da dove partire per vedere cosa sta succedendo, potreste darmi dei consigli per vedere se mi sblocco?

Vi ringrazio molto.
 
Discussioni simili
Autore Titolo Forum Risposte Data
P Passare solo una variabile di un form a pagina principale Javascript 1
B passaggio dati da popup a form principale Javascript 0
S passare un valore da un form a un file .php con metodo post PHP 4
K Form che manda dati doppi PHP 1
K Problema form update PHP 2
Elisacau [Contact form 7] Inserire Numero auto incrementante WordPress 1
K form Inserimento record mysql PHP 2
I Form con selettore HTML e CSS 0
K [php]form invio dati PHP 0
G form invio multiplo con checkbox PHP 12
nivaria.achinet Intercettare form solo dopo invio Javascript 1
D Form contatti non funzionante HTML e CSS 0
A Stampare dati da form PHP 8
M Unire 2 funzioni per l'invio di un form e con l'apertura di un div Javascript 0
I Form HTML e CSS 17
otto9due $_FILE non passa i dati dal form PHP 1
M Form: come tornare ai campi già compilati dopo invio PHP 1
G Invio form con PHP PHP 3
felino Form action costum e parametri in queryString WordPress 1
M Come recuperare molteplici input form PHP 1
M Collegamento tra form html e script php PHP 4
L form immagini per il database PHP 0
A form PHP prenotazione tramite query PHP 2
A Form php prenotazione di un azienda sanitaria locale presso studio medico PHP 1
L inserimento form dati multipli ? PHP 0
L Problemi form Pagina php HTML e CSS 3
Cosina Creare bottone delete in form upload PHP 5
Cosina Creare bottone delete in form upload PHP 1
D Devo far funzionare un form di contatti PHP 4
B form gestione input PHP 2
V PHP form intersecate PHP 0
8 Javascript - PDF Form Javascript 0
J Form inserimento dati in database Ajax 1
E Gestione profilo utente tramite Form PHP 3
M Problema con controllo form in real time jQuery 6
D Form validazione Javascript 2
R form recovery pass PHP 0
V Symfony e i form PHP 3
M form con checkbox PHP 8
S come aggiustare un form di contatto? HTML e CSS 3
F query e form con select multipla PHP 17
MarcoGrazia Verifica di una stringa o di un nome proveniente da form Snippet PHP 0
A Inserimento dati nel database tramite form + altre operazioni PHP 18
websilvia Contact form using Bootstrap 3.3.4 PHP 8
Alex_70 Button non funziona nella form PHP 2
C Form email php su pagina index.html? PHP 21
W Rinominare Documenti Con Form Asp Classic ASP 9
S Invio email da form PHP 8
L form multipla php sql,errore in inserimento MySQL 0
L inviare i dati di un form ad un database PHP 6

Discussioni simili