2013-04-17 3 views
1

Я пробовал искать и искать это, но, возможно, я искал неправильную вещь.C# сборка и форма обновления Live

Я создаю своего рода панель управления, где я могу добавить некоторые DLL-файлы для динамической загрузки. Для меня не проблема загружать библиотеки DLL и никаких проблем, чтобы запустить его - я использую «Activator.CreateInstance», чтобы сделать это на данный момент.

Метод делает именно то, что я хочу, чтобы он делал.

... Но мне нужна помощь паре вещей:

1: Когда я выполнение библиотеки DLL, форма морозильная, даже если я бег его в потоке - Как сделать Я избегаю этого?

2: Мне нужно уметь читать текущее состояние DLL, жить - файлы DLL сделаны с суперклассом, поэтому я могу прочитать «CurrentStatus» -property. Возможно ли прочитать этот статус запущенных файлов? Мне кажется, так как программа ждет завершения DLL, и это заставляет ее замораживаться.

Надеюсь, некоторые из вас могут мне помочь.

Заранее спасибо :)

Edit: Добавление код

   string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, curJob.Scheduler_JobAssemblyName + ".dll"); 
       Assembly assembly = Assembly.LoadFile(path); 

       GenericSchedulerJob o = (GenericSchedulerJob)Activator.CreateInstance(Type.GetType(curJob.Scheduler_JobAssemblyName + "." + curJob.Scheduler_JobAssemblyName + ", " + curJob.Scheduler_JobAssemblyName, true)); 
       Thread thread = new Thread(() => ExecuteDLL(ref o, "RunJob", row)); 
       thread.Start(); 
       while (!o.JobFinished) 
       { 
        // Do something (update status, etc.) 
       } 


    private string ExecuteDLL(ref GenericSchedulerJob job, string methodName, DataGridViewRow row) 
    { 
     string returnVal; 
     if (job != null) 
     { 
      // Get method 
      MethodInfo mi = job.GetType().GetMethod(methodName); // Get method info 
      if (mi != null) 
      { 
       // Let's start ... 
       returnVal = (string)mi.Invoke(job, null); // Execute method with parameters 
      // job is the SuperClass, where I can read the status from 
      } 
      else 
      { 
       returnVal = "Method <" + methodName + "> not found in class."; // Error .. 
      } 
     } 
     else 
     { 
      returnVal = "Class not found in external plugin."; // Error .. 
     } 

     return ""; 
    } 
+0

к сожалению, мой хрустальный шар для ремонта, вы будете необходимо показать код. – nvoigt

+0

Выполнено, первый фрагмент кода находится в файле timer_tick, так как он является планировщиком, который работает с определенным интервалом – Oxholm

ответ

1

Ну форма паузы, потому что этот код

  while (!o.JobFinished) 
      { 
       // Do something (update status, etc.) 
      } 

заставляет его ждать, даже если фактическая dll работает в другом потоке.

Необходимо закончить метод. (Или, я полагаю, вы могли бы использовать Application.DoEvents(), если он не оставляет неприятного вкуса во рту.

Чтобы получить информацию о статусе, вы должны использовать событие, которое вы можете подключить после создания dll. получать уведомления, когда длл изменяет его статус.

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

+0

Я получил его, работая с событиями в DL Ls, так что это был прекрасный ответ! Я добавил дополнительное событие, рассказывающее о завершении работы DLL и обработке этого в «родительском». Большое вам спасибо! :) – Oxholm

+0

@Oxholm, проблем нет. Рад, что смог помочь –