Вызывать методы в потоке - PullRequest
1 голос
/ 30 марта 2012

Я не могу использовать eventArgs из метода, запущенного для второго потока:

 public class MovilinkCommunication
 {
    //Method Declarations
    public delegate void MovilinkWatchParametersEventMethod(ParameterAddress sender, MovilinkEventArgs e);
    private MovilinkWatchParametersEventMethod onWatchParameterMethod;

    //class constructor
    //here, the user inputs the method (in main thread) that desires to call in
    //parameter changed moment
    public MovilinkCommunication(MovilinkWatchParametersEventMethod userOnWatchParameterMethod)
    {
        //assign user method (in main thread) to wach variables
        onWatchParameterMethod = userOnWatchParameterMethod;

        //start communication thread (second thread)
        Thread movilinkThread = new Thread(new ThreadStart(movilinkIOManagerThread));
        movilinkThread.Start();
    }
    .
    .
    .
    //create delegates with "sender" parameter and "e" conditions of call
    delegate void CallOnWatchParameterMethod(ParameterAddress sender, MovilinkEventArgs e);
    private void callOnWatchParameterMethod(ParameterAddress sender, MovilinkEventArgs e) 
    { 
        //calling user method in main thread with event args obtained in
        //communication thread (second thread)
        onWatchParameterMethod(sender, e); 
    }
    .
    .
    .
    //communication thread
    private void movilinkIOManagerThread()
    {
        ParameterAddress sender;
        MovilinkEventArgs e;
        .
        .
        .
        while (movilinkAccessor.OperationStatusOk)
        {
            .
            .
            .
            CallOnWatchParameterMethod thdCallOnWatchParameterMethod =
               new CallOnWatchParameterMethod(callOnWatchParameterMethod);

            Dispatcher.CurrentDispatcher.Invoke(thdCallOnWatchParameterMethod, new object[] { sender, e });
            .
            .
            .
        }
    }   
}

Работает нормально, но когда я пытаюсь использовать аргументы событий "sender" и "e" в методе пользователя (в основном потоке), появляется сообщение ниже: «Вызывающий поток не может получить доступ к этому объекту, потому что другой поток владеет им.»

Может кто-нибудь дать мне подсказку об этой проблеме? Спасибо,

Jeferson


Следуй за Тюдором, еще раз спасибо. Этот код находится в коде window.xaml.cs. Код в первом посте находится в MovilinkComunication.cs.

MovilinkCommunication comunicadorMovilink;
private void wndPrincipal_Loaded(object sender, RoutedEventArgs e)
{
    //creating communication object, setting the desired event
    //to be trigged in secundary thread
    comunicadorMovilink = 
        new MovilinkCommunication(getChangeParameters_Movilink);
}        
.
.
.
//desired method to made actions in window, if detected
//change of parameters in external hardware
private void getChangeParameters_Movilink(ParameterAddress sender, MovilinkEventArgs e)
{
    //error occurs here. Any code with GUI return error.
    label24.Content = e.ActualValue.ToString();
}

Ответы [ 3 ]

0 голосов
/ 31 марта 2012

Обновление ярлыка должно быть выполнено через Dispatcher.BeginInvoke:

private void getChangeParameters_Movilink(ParameterAddress sender, MovilinkEventArgs e)
{
    label24.Dispatcher.BeginInvoke(
       (Action)(() =>
       {
          label24.Content = e.ActualValue.ToString();
       }));
}
0 голосов
/ 07 января 2014

Большое спасибо, все отлично работает

if (this.InvokeRequired)
{
  BeginInvoke(new MethodInvoker(delegate()
  {
    printausfueren();
  }));
}
else
{
     printausfueren();
}
0 голосов
/ 30 марта 2012

если ваше приложение - winforms, вы можете сделать это

    public void d()
    {
        if (this.InvokeRequired)
        {
            BeginInvoke( new MethodInvoker( delegate() { 
                foo(a, b); 
            } ) );
        }
        else
        {
            foo(a, b);
        }
    }

    private void foo(int a, int b)
    {

    }

, в этом примере d и foo находятся в классе формы

...