Возврат обновлений из метода - PullRequest
1 голос
/ 26 ноября 2011

Я запустил небольшое приложение (C #, .Net4, консольное приложение), и оно было основной идеей для перемещения файлов в домашних условиях на основе правил.

Это приложение выросло и стало чрезвычайно полезным.Поэтому моя задача - разбить его на более многократно используемые классы и более мелкие проекты (библиотеки классов).

У меня есть общая функция Show, которая принимает строку, и идентификатор error_level.Исходя из этого, я бы выводил текст в окно консоли определенного цвета.Все хорошо, когда все в одном большом классе, но я хочу переместить метод в свой собственный класс libabry - однако, я хочу, чтобы он сообщал об обновлениях во время обработки в мой интерфейс (пока что окно консоли).Когда я перемещаю его в класс, очевидно, из класса в мой метод 'Show', break.

Есть ли способ получить сообщения, отправленные из моего метода класса, обратно в мой интерфейс?Это такие сообщения, как «Открытый файл конфигурации», «Обработка 12 новых файлов», «Успех».

И, как это происходит, пользовательский интерфейс получает сообщения и отображает их, пока метод завершает свою работу.

На данный момент это проект консольного приложения.Мой план состоит в том, чтобы вырвать рабочий код, оставить консольное приложение для тестирования, а затем превратить «пользовательский интерфейс» в отличное приложение для рабочего стола WPF.(Я пытаюсь изучить WPF, и решил использовать небольшой проект, который я начал много лет назад, и «сделать скин»).

Ответы [ 4 ]

2 голосов
/ 26 ноября 2011

Я бы предложил добавить интерфейс, реализовать этот интерфейс в вашем пользовательском интерфейсе и передать ссылку на класс, который реализует интерфейс, в ваши новые классы.

Этот подход должен работать, если вы выполняете работу в одном потоке или нескольких потоках.

Например, интерфейс:

public interface INotify
{
    void Notify(string Msg);
}

пользовательский интерфейс:

public class Form1 : INotify
{
        // This is the method where you instantiate the new worker process
        public void DoSomeWork() {
            NewClass Worker = New NewClass(this);
        }

        public delegate void NotifyDelegate(string Msg);

    public void Notify(string Msg)
    {
        txtLog.Text += Msg + Environment.NewLine;
    }

    void INotify.Notify(string Msg)
    {
        this.INotify_Notify(Msg);
    }
    private void INotify_Notify(string Msg)
    {
        if (this.InvokeRequired)
        {
            this.Invoke(new NotifyDelegate(Notify), Msg);
        }
        else
        {
            this.Notify(Msg);
        }
    }
   }

и новый класс (просто позвоните notify в этом классе, чтобы отправить сообщение):

public class NewClass
{
    private INotify m_Notifier;

    private void Notify(string Msg)
    {
        m_Notifier.Notify(Msg);
    }

    public NewClass(INotify oNotifier)
    {
        m_Notifier = oNotifier;
    }
}

Обновление с альтернативной реализацией

Альтернативной реализацией, которая будет работать со статическими классами, является реализация делегата.

Например, вот делегат:

public delegate void NotifyDelegate(string Msg);

Вот пример статического класса для консольного приложения:

static class Program
{
    private static NotifyDelegate m_Notifier;
    static void Main(string[] args)
    {
        m_Notifier = new NotifyDelegate(Notify);

        NewClass oNewClass = new NewClass(m_Notifier);

        // Your work code here
    }
    static void Notify(string Msg)
    {
        Console.WriteLine(Msg);
    }
}

и пересмотренный вариант рабочего класса:

public class NewClass
{
    private NotifyDelegate m_Notifier;

    public void Notify(string Msg)
    {
        m_Notifier.Invoke(Msg);
    }

    public NewClass(NotifyDelegate oNotifier)
    {
        m_Notifier = oNotifier;
    }
}
2 голосов
/ 26 ноября 2011

Если я правильно понимаю ваш вопрос, я бы реализовал обработку событий, чтобы ваш пользовательский интерфейс мог подписаться на какой-то статус событие . Альтернативой может быть использование какой-либо среды ведения журналов, такой как NLog, и запись в статический метод в вашем пользовательском интерфейсе через цель methodCall . Поскольку вы используете WPF, имеет смысл использовать MVVM . Вероятно, это был бы лучший способ создания мощных и поддерживаемых пользовательских интерфейсов.

1 голос
/ 26 ноября 2011

Может ли класс (ы), который работает, вызвать событие , которое прослушивает класс в потоке пользовательского интерфейса? Класс 'worker' вызовет событие с некоторыми параметрами, а класс слушателя запишет эту информацию в пользовательский интерфейс.

1 голос
/ 26 ноября 2011

Что ж, обычно это делается с помощью Binding, вы привязываете свою viewModel к представлению, и любые изменения в viewModel будут напрямую отображаться в вашем пользовательском интерфейсе.

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