Metoda wywoływana w backgroundworker nie działa

0

Witajcie, piszę program który będzie wysyłał jeden konkretny plik na google drive. Zrobiłem sobie ładne GUI gdzie jest pole tekstowe na email i przycisk połącz. Wszystko działa ale problem jest przy łączeniu bo całe GUI zwiesza się na czas łączenia. Żeby to obejść próbuję użyć backgroundworkera który wykona połączenie w tle i nie zawiesi programu. Niestety po wywołaniu mojej funkcji łączącej w evencie backgroundworker_doWork nic się nie dzieje i nie uzyskuję połączenia.
Proszę o pomoc jak to uruchomić bo już nie mam pomysłów.

 //Funkcja obsługujaca połączenie z Google
        private void polacz_z_Google()
        {
           if(b_Polacz_serw.Text == "Połącz")
            {
                if (string.IsNullOrWhiteSpace(tb_Login.Text))
                {
                    MessageBox.Show("Pole Gmail nie może być puste", "Informacja", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    if (tb_Login.Find("@gmail.com") > 0)
                    {
                        try
                        {
                            string yourAppClientID = "NIE MOGĘ POKAZAĆ";
                            string yourAppClientSecret = "NIE MOGĘ POKAZAĆ";

                            string[] scopes = new string[] { DriveService.Scope.Drive, Oauth2Service.Scope.UserinfoEmail };
                  
                            credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                           new ClientSecrets
                           {
                               ClientId = yourAppClientID,
                               ClientSecret = yourAppClientSecret,
                           },
                            scopes,
                            "user",
                            CancellationToken.None).Result;

                        }
                        catch
                        {
                            MessageBox.Show("Użytkownik nie zezwolił na połączenie", "Informacja", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }

                        info_status_Google();
                    }
                    else
                    {
                        MessageBox.Show("Nieprawidłowy adres Gmail, wprowadź adres w formacie uż[email protected]", "Informacja", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
            }
            else if(b_Polacz_serw.Text == "Rozłącz")
            {
                b_Polacz_serw.Text = "Połącz";
                lab_status_serw.Text = "Rozłączony";
                pb_status_serw.BackColor = Color.Red;
                pb_status_panel_serw.BackColor = Color.Red;
                sprawdz_stan_polaczenia_google = false;
                
                tb_Login.Enabled = true;
                credential.RevokeTokenAsync(CancellationToken.None);
            }


        }

Przycisk:

      //Obsługa przycisku połącz z serwerem
        private void b_Polacz_serw_Click(object sender, EventArgs e)
        {
            Worker1.RunWorkerAsync();
        } 

Worker:

 private void Worker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
        {
            polacz_z_Google();
        }
0

Dostajesz wyjątek bo odwołujesz się do kontrolek z innego wątku czego nie możesz zrobić. Wyjątek mógłbyś zobaczyć w zdarzeniu completed ale nigdy go nie obsłużyłeś.
Mógłbyś to rozwiązać przez Invoke lub przez przekazanie parametrów do workera ale w ogóle odpuść sobie background workery bo to średniowiecze i naucz się async/await

0

Ok dodałem async i await ale nadal program się blokuje

 //Funkcja obsługujaca połączenie z Google
        private async Task polacz_z_Google()
        {
           if(b_Polacz_serw.Text == "Połącz")
            {
                if (string.IsNullOrWhiteSpace(tb_Login.Text))
                {
                    MessageBox.Show("Pole Gmail nie może być puste", "Informacja", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    if (tb_Login.Find("@gmail.com") > 0)
                    {
                        try
                        {
                            string yourAppClientID = "";
                            string yourAppClientSecret = "";

                            string[] scopes = new string[] { DriveService.Scope.Drive, Oauth2Service.Scope.UserinfoEmail };
                  
                            credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
                           new ClientSecrets
                           {
                               ClientId = yourAppClientID,
                               ClientSecret = yourAppClientSecret,
                           },
                            scopes,
                            "user",
                            CancellationToken.None);

                        }
                        catch
                        {
                            MessageBox.Show("Użytkownik nie zezwolił na połączenie", "Informacja", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }

                        info_status_Google();
                    }
                    else
                    {
                        MessageBox.Show("Nieprawidłowy adres Gmail, wprowadź adres w formacie uż[email protected]", "Informacja", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
            }
            else if(b_Polacz_serw.Text == "Rozłącz")
            {
                b_Polacz_serw.Text = "Połącz";
                lab_status_serw.Text = "Rozłączony";
                pb_status_serw.BackColor = Color.Red;
                pb_status_panel_serw.BackColor = Color.Red;
                sprawdz_stan_polaczenia_google = false;
                
                tb_Login.Enabled = true;
                await credential.RevokeTokenAsync(CancellationToken.None);
            }


        }
       
0

polacz_z_Google też trzeba wywołać z awaitem.

0

Dodaję w zdarzeniu przycisku

await polacz_z_google(); 

ale od razu dostaję błąd że await możliwe tylko z metodą async.

0

I co cię powstrzymuje przed dopisaniem tego brakującego async do metody obsługi zdarzenia?

0

Udało się to ogarnąć w inny sposób :)

0

Jaki?

Bo użycie async/await to w tym przypadku najlepsze rozwiązanie.

0

Utworzyłem nowy wątek Thread i w nim uruchomiłem całą funkcję :)

Nie musi być najlepsze, ma działać tak jak chciałem :)

0

Czyli rozwiązanie najgorsze z możliwych... ale jak ma tylko działać to cóż.

1 użytkowników online, w tym zalogowanych: 0, gości: 1