Как реализовать прогресс с помощью IEnumerable? - PullRequest
1 голос
/ 23 марта 2011

У меня есть метод, который перебирает коллекцию IEnumerable и передает каждый из них другому методу.Что-то вроде:

void Run (object item)
{
    foreach(var method in this.Methods)
        method (item);
)

Как я могу реализовать вид прогресса, который будет отображаться в индикаторе выполнения?Я мог бы сделать это легко, если бы он был непосредственно закодирован внутри этого метода, но этот метод содержится в типе вне ViewModel, который я, конечно, могу вызвать.

Я просто не знаю, как это реализоватьи получить его из этого метода и отразить изменения в пользовательском интерфейсе, передав его ViewModel и т. д.

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 23 марта 2011

В итоге я передаю делегат, используемый для отчета о прогрессе.Это обеспечивает очень хорошую развязку.Делегат может быть реализован как лямбда-функция, которая напрямую устанавливает прогресс в форме.

void Run (object item, Action<float> progress)
{ 
    int total = MethodCollection.Count; 
    int index = 0;
    foreach(var method in MethodCollection)
    {
        method (item);
        progress(index/(float)total);
    }
)

Для длительных задач я бы делал это в отдельном потоке, используя BackgroundWorker, который имеет встроенные хуки для отчетов о ходе выполнения.

2 голосов
/ 23 марта 2011

Я бы подошел к этому, используя события следующим образом.

public class ViewModel : ViewModelBase
{
    private int m_CurrentProgress;
    private int m_MethodCount;

    // Bind this to the progress bar
    public int CurrentProgress
    {
        get { return m_CurrentProgress; }
        set
        {
            m_CurrentProgress = value;
            OnPropertyChanged("CurrentProgress");
        }
    }

    // Bind this to the progress bar
    public int MethodCount
    {
        get { return m_MethodCount; }
        set
        {
            m_MethodCount = value;
            OnPropertyChanged("MethodCount");
        }
    }

    private void MethodExecuted(object sender, EventArgs e)
    {
        CurrentProgress++;
    }

    public void Run()
    {
        var c = new ExternalClass();
        MethodCount = c.Methods.Count;
        c.MethodExecuted += MethodExecuted;

        c.Run(null);
    }
}

public class ExternalClass
{
    public List<object> Methods { get; set; }

    public event EventHandler<EventArgs> MethodExecuted;

    public void InvokeMethodExecuted(EventArgs e)
    {
        EventHandler<EventArgs> handler = MethodExecuted;
        if (handler != null)
        {
            handler(this, e);
        }
    }

    public void Run(object item)
    {
        foreach (var method in Methods)
        {
            method(item);

            InvokeMethodExecuted(null);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...