Jak zrobić działające przyciski podczas pracy programu?

0

Cześć,
Mam programik który ściąga strony WWW i przetwarza mi je do Excela, mam przyciski mam ustawione przyciski Start, zakończ , lecz dopóki nie skończy pobierać i przetwarzać stron WWW to przycisk wyjdź mi nie działa i program można zamknąć tylko poprzez menadżer zadań, nie wiem jak zrobić żeby przycisk zakończ działał podczas działania programu a nie jak się już wykona.

1

Spróbuj to zrobić na wątkach lub pobieraj asynchronicznie.

0

a mógłbys coś podpowiedziec stronke , kodzik.

0

Wystarczy przerobic kod pobierania strony www na asynchroniczny z wykorzystaniem async/await. Wrzuc tutaj metode odpowiedzialna za to to dopiszemy pare rzeczy:)

Ewentualnie mozesz zapoznac sie np z tym: http://alexmg.com/introduction-to-the-httpclient/

0

Do tego nie trzeba zbyt wiele wysiłku, po prostu długo trwający kod odpalasz przez Task.Run, do tego możesz użyć tokena, aby przerwać wykonywanie tego taska, na przykład:

namespace WindowsFormsApplication1
{
  public partial class Form1 : Form
  {
    private CancellationTokenSource _tokenSource;

    public Form1()
    {
      InitializeComponent();
    }

    private async void button1_Click(object sender, EventArgs e)
    {
      if(_tokenSource != null) _tokenSource.Cancel();
      _tokenSource = new CancellationTokenSource();
      var number = await Task.Run(() => LongTask(_tokenSource.Token));
      textBox1.Text = number.ToString();
    }

    private void button2_Click(object sender, EventArgs e)
    {
      if(_tokenSource != null) _tokenSource.Cancel();
    }

    private int LongTask(CancellationToken token)
    {
      for(var i = 0; i < 3; ++i)
      {
        if(token.IsCancellationRequested)
          return -1;

        Thread.Sleep(1000);
      }

      return 10;
    }
  }
}
0
                for ( z = 0; z < j + 1; z++)
                {
                    link_textbar2 = link_textbar + ",p," + (z + 1);
                    WebRequest request2 =  WebRequest.Create(@link_textbar2);

                    WebResponse response2 = request2.GetResponse();
                    Stream data2 = response2.GetResponseStream();
                    string html2 = String.Empty;

                    using (StreamReader sr0 = new StreamReader(data2))
                    {
                        try
                        {
                            sr0.BaseStream.ReadTimeout = 5000;
                            html2 = sr0.ReadToEnd();

                        }
                        catch (WebException)
                        {
                          
                            DialogResult result = MessageBox.Show("Czy chcesz kontynuować?", "Połączenie przerwane", MessageBoxButtons.YesNoCancel);
                          if (result == DialogResult.No)
                            {
                                k = 1;

                            }
                        }
                    }
}

niestety nie wiem jak to dołączyć aby działało.

zamiana znacznika <code class="c#"> na <code class="csharp"> - @furious programming

0

Bo programowanie nie polega na zbieraniu klocków w internecie i wklejaniu do swojego projektu, a na myśleniu!

0

Tutaj masz gotowca:

        public async Task<string> GetSourceCode(string url)
        {
            string result = String.empty;
			using (var netClient = new HttpClient())
            {
                var serverResponse = await netClient.GetAsync(new Uri(url));
                if (serverResponse.IsSuccessStatusCode)
                    result = serverResponse.Content.ReadAsStringAsync().Result;
            }
            return result;
        }

Wywolanie:

 var result = await GetSourceCode("http://dupa.pl");

Pisane calkowicie z palca, chodzilo mi jedynie o samo przedstawienie szablonu

0

async i await są już takim ułatwieniem dla programowania wielowątkowego że już chyba bardziej nie można

poćwicz temat na tym co powyżej, jak zrozumiesz to wróć do swojego projektu, jak nie to daruj sobie - po prostu Twój program będzie działał jak każdy inny program początkującego

możesz też spróbować użyć starego dobrego BackgroundWorkera - chyba łatwiejszy do zrozumienia przez początkujących ale dający brzydszy kod i mniejszą elastyczność

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