1

Добрый день, столкнулся с непониманием того как вывести актуальную информацию на TextBox из метода класса. У меня есть класс :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TextIteration
{
class Iteration
{
    public void StartIterator()
    {
        for (int i = 0; i < 1000; i++)
        {
            // Вывод числа i.
            Thread.Sleep(100);
        }
    }
}
}

Перечисление числа I из цикла я хочу получить в TextBox формы когда нажму кнопку на форме. Как правильно реализовать это?

Petr
  • 511
  • Можно сделать чтоб StartIterator() возвращал не void, а IEnumerable<int> для этого нужно будет в цикле использовать yield return i. – Bulson Dec 24 '17 at 13:52
  • Т.е. у вас некоторый класс, в котором поочередно меняется значение и вы хотите когда оно меняется выводить его на форме? У вас WinForms-проект, я правильно понимаю? – Андрей NOP Dec 24 '17 at 13:56
  • @Андрей все верно. Актуальное число так сказать, что бы в TextBox показало перечисление чисел от 0 до 1000. – Petr Dec 24 '17 at 13:59
  • @Petr, для начала прочтите это: https://ru.stackoverflow.com/q/615113/218063 возможно вопросов не останется – Андрей NOP Dec 24 '17 at 14:05
  • @Petr, вот еще по теме: https://ru.stackoverflow.com/q/418461/218063 – Андрей NOP Dec 24 '17 at 14:07
  • @Андрей я почему то думал, что надо через события цеплять. Что вроде помещать в переменную значение I а потом через событие смотреть. – Petr Dec 24 '17 at 14:52

1 Answers1

5

Пример работы примера

Вывод правда я сделал в Label, а не TextBox, ну да это по невнимательности.

public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();
    }

    //источник токена отмены
    private CancellationTokenSource _tokenSource;

    private async void buttonStart_Click(object sender, EventArgs e)
    {
        //через него будем оповещать о ходе выполнения задачи
        Progress<string> progess = new Progress<string>(text => this.labelOutput.Text = text);

        //готовим токен отмены
        _tokenSource = new CancellationTokenSource();
        CancellationToken cancelToken = _tokenSource.Token;

        //кнопки
        buttonStart.Enabled = false;
        buttonCancel.Enabled = true;

        try
        {
            await Task.Run(() => DoIteration(cancelToken, progess), cancelToken);
        }
        catch (OperationCanceledException)
        {
            //случай отмены
            this.labelOutput.Text = "0";
        }
        catch (Exception)
        {
            this.labelOutput.Text = "Ошибка";
        }
        finally
        {
            //кнопки
            buttonStart.Enabled = true;
            buttonCancel.Enabled = false;
        }

    }

    //метод выводит числа
    private void DoIteration(CancellationToken cancelToken, IProgress<string> progess)
    {
        Iteration iteration = new Iteration();

        foreach (int number in iteration.StartIterator())
        {
            progess.Report(number.ToString());

            //выбрасываем исключение в случае нажатия на кнопку отмены
            cancelToken.ThrowIfCancellationRequested();
        }
    }

    private void buttonCancel_Click(object sender, EventArgs e)
    {
        _tokenSource.Cancel();
    }
}

class Iteration
{
    public IEnumerable<int> StartIterator()
    {
        for (int i = 0; i < 1000; i++)
        {
            // Вывод числа i.
            Thread.Sleep(100);

            yield return i;
        }
    }
}
Bulson
  • 9,411
  • Спасибо за такой ответ:) – Petr Dec 24 '17 at 14:51
  • Да, пожалуйста. – Bulson Dec 24 '17 at 14:52
  • Нет желания ответить на https://ru.stackoverflow.com/q/615113/178779? Там как раз не хватает способа через фоновой поток и IProgress. – Pavel Mayorov Feb 14 '18 at 13:38
  • @PavelMayorov я вижу, что этот вопрос уже закрыт, т.е. автор вопроса получил ответ, который его вполне удовлетворил. Или нет? – Bulson Feb 14 '18 at 13:40
  • @Bulson не путайте "получен ответ" и "закрыт". Вопросы закрываются только когда им нечего делать на сайте или когда они дубликаты. На все остальные вопросы можно отвечать в любое время если есть что добавить по теме. – Pavel Mayorov Feb 14 '18 at 13:42
  • @Bulson что же до того конкретного вопроса - обратите внимание что автор у вопроса и ответа один и тот же. Это так называемый канонический вопрос. В таких вопросах мы собираем подробные ответы на популярные вопросы чтобы не отвечать каждый раз одно и то же. – Pavel Mayorov Feb 14 '18 at 13:44
  • @PavelMayorov мне надо сделать тупо копипаст или как-то иначе? – Bulson Feb 14 '18 at 13:44
  • @Bulson можно и просто копи-паст, задача-то один в один. Но я бы порекомендовал добавить немного пояснений что и зачем делается за пределами кода - иначе на другого соседнего ответа будет смотреться очень бедно. – Pavel Mayorov Feb 14 '18 at 13:50
  • @PavelMayorov хорошо, я сейчас займусь. – Bulson Feb 14 '18 at 13:51
  • @PavelMayorov вот сделал – Bulson Feb 14 '18 at 15:11