Event in einem Workerthread



  • Hallo zusammen.

    Von einer externen SPS Hersteller haben wir eine Schnittstelle um Variablen auszulesen.
    Hier bei ist es notwendig alle Operationen im selben Thread zu machen. Sei es UI oder Workerthread.

    Was aber nicht funktioniert sind die Events die ich von der SPS erhalte. Die sind grundsätzlich immer im UI Thread.
    Kann ich da was machen damit auch die Events im Workerthread kommen oder muss ich den Hersteller kontaktieren?



  • @booster
    Oder du musst die Events an den Workerthread delegieren?
    Insgesamt ist die Frage aber nicht ganz klar, was sollen denn UI und Workerthread machen? Und warum funktioniert das, was du gerade machst, nicht?



  • @booster sagte in Event in einem Workerthread:

    Kann ich da was machen damit auch die Events im Workerthread kommen oder muss ich den Hersteller kontaktieren?

    Ziemlich sicher ja. Kommt aber drauf an wie diese Schnittstelle zur SPS aussieht.



  • Um mal etwas Code zu zeigen:
    Die AdsNotification wird immer im UI Thread ausgeführt.

    public class ViewModel
    {
        public ViewModel()
        {
            var threadCreated = new ManualResetEvent(false);
            var plcThread = new Thread(() =>
            {
                    
    
                var adsClient = new AdsClient();
                var adsVarManager = new AdsVarManager();
    
                adsClient.AdsNotification += (sender, e) =>
                {
                    CheckThread();
                        
                    var variable = adsVarManager.SynchronizeVar(e);
                    Console.WriteLine(((AdsInt16Var)variable).ScaledValue);
                };
    
    
                adsClient.Connect(851);
    
                adsVarManager.CreateVariableFromFile(@"D:\Projekte\Test&Examples\ADSThreadTest\ADSVars.xml", adsClient);
    
                adsVarManager.AddNotification(
                    adsClient, 
                    (AdsInt16Var)adsVarManager.VarByName("MAIN._test"),
                    AdsTransMode.OnChange, 
                    0, 
                    0, 
                    null);
    
                CheckThread();
                threadCreated.Set();
                Dispatcher.Run();
            })
            {
                IsBackground = true,
            };
            plcThread.Start();
            threadCreated.WaitOne();
        }
    
    
        private void CheckThread()
        {
            Dispatcher dispatcher = Dispatcher.FromThread(Thread.CurrentThread);
            if (dispatcher != null && dispatcher.CheckAccess())
            {
                // We know the thread have a dispatcher that we can use.
                Console.WriteLine("UI Thread");
            }
            else
            {
                Console.WriteLine("No UI Thread");
            }
        }
    }


  • Aha.


Log in to reply