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

2015-02-24 10:28
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.

Pozostało 580 znaków

2015-02-24 10:39
1

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


GG: 10101100010110000100011101 (BIN)
"Nie wszystko napisane w internecie jest prawdą" - Józef Piłsudski.

Pozostało 580 znaków

2015-02-24 10:40
0

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

Pozostało 580 znaków

2015-02-24 10:45
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/

edytowany 1x, ostatnio: FakeAccount, 2015-02-24 10:46

Pozostało 580 znaków

2015-02-24 11:08
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;
    }
  }
}

Pozostało 580 znaków

2015-02-24 12:08
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

edytowany 3x, ostatnio: furious programming, 2015-02-24 17:57
Do C# są znaczniki &lt;code=csharp&gt; - furious programming 2015-02-24 17:58

Pozostało 580 znaków

2015-02-24 13:47
0

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

Pozostało 580 znaków

2015-02-24 13:55
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

Pozostało 580 znaków

2015-02-24 14:00
sgddg
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ść

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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