C # Как я могу обновить форму управления из стороннего кода - PullRequest
0 голосов
/ 20 июля 2011

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

Проблема в том, что я написал вызов letЭто worker-code внутри Form-класса.Теперь я хочу вытащить этот рабочий код в отдельный класс.

Давайте сделаем небольшой пример, чтобы прояснить мои потребности:

public partial class form1 :Form
{ 
  void AddLogmessage(String msg)
  {
     // update an listview
     ListViewItem item = new ListViewItem();
     item.Text = msg;

    // Add the item to the ListView
    LogView.Items.Add(item);
  }

// button on ui to start working
private void btnStartTestRun_Click(object sender, EventArgs e)
{
  try
  {
     DoSomeWork();
  }
  catch(Exception ex)
  {}
}

private void DoSomeWork()
{
  // do some really generic hard work....
  AddLogMessage("working");

  // do some more generic long lasting hard work....

  AddLogMessage("working goes on...");

 // in case of an error throw Exception

}

Теперь я хочу перекодировать рабочий код для работывне класса формы, но иметь возможность сообщать о том, что происходит с пользовательским интерфейсом (если он есть), или вызывать рабочий код без пользовательского интерфейса и делать другие отчеты для другой цели (общаться с другой библиотекой, которая сообщает результаты на сервер)

Примерно так:

 public void AutomaticTaskHandler()
 {
   string[] cmdline = Environment.GetCommandLineArgs();
   Arguments args = new Arguments(cmdline);

   if (args["automatic"] != null)
   {
      doSomeWork();
   }
 }

В этом случае мне не нужно сообщать сообщения в пользовательский интерфейс, а отправлять некоторые другие сообщения (НЕ те же сообщения !!) насервер.

Таким образом, мой вопрос заключается в том, как сделать так, чтобы не было необходимости писать дважды код doSomeWork, но чтобы можно было отправлять только те сообщения, которые находятся в текущей сцене?

Я думал о Delegates и Events, но я не слишком знаком с этим, чтобы сделать эту работу.

Любая помощь будет оценена.

Спасибо Meister_Schnitzel

1 Ответ

0 голосов
/ 20 июля 2011

По сути, вы бы создали интерфейс IMessageTarget с методом SendMessage. Ваш код пользовательского интерфейса будет создавать реализацию этого интерфейса, который выводит сообщения в пользовательский интерфейс, а код вашей консоли будет создавать реализацию этого интерфейса, который отправляет сообщения на сервер. При вызове метода doWork вы должны предоставить экземпляр IMessageTarget.

...