Laden...
J
jogibear9988 myCSharp.de - Member
Programmierer Offenau Dabei seit 17.07.2007 648 Beiträge
Benutzerbeschreibung

Forenbeiträge von jogibear9988 Ingesamt 648 Beiträge

14.06.2024 - 09:55 Uhr

Zitat von HermannKregel

@jogibear9988

Vielen Dank für Deinen Code. Das hätte ich so (noch) nicht hinbekommen...

Ich finde den Code nicht gut...

Warum das bild immer abspeichern? Warum die List eimmer aktualisieren, auch wenn sich z.B. nichts geändert hat, ...
Das geht sicher besser.

Wie könnte ich den Code hier optmieren?

Ich würde z.B.:

  • Die Bilder nicht ins Dateisystem legen sondern nur im Speicher halten. bspw in der Runnings App Klasse Statt dem Pfad, Direkt das Image bzw die Bildaten halten.
  • Die Running apps liste nur mit den neuen Prozessen füllen und die alten entfernen und nicht immer neu bauen
  • Die UI nur so aktualiseren das neue Prozesse dazukommen und alte entfernt werden, nicht immer alles neu Zeichnen
  • Die Liste in XAML mit ItemsTemplate und ItemsSource füllen und nicht die Objekte im Code anlegen
14.06.2024 - 09:48 Uhr

Bei mir funktioniert es wenn ich diese als style im body einbinde...

14.06.2024 - 09:21 Uhr

Ja und ist es nicht möglich 3 zeilen CSS einzufügen?

13.06.2024 - 17:51 Uhr

so wie es gerade ist, ist der dark mode ja nicht nutzbar

13.06.2024 - 17:49 Uhr

wie wäre es mit diesem style:

    [data-theme="dark"] .ck.ck-content.ck-editor__editable {
       color: black !important;
   }
13.06.2024 - 07:42 Uhr

Passiert an den Bugs im Forum eigentlich noch was? Im Dark Mode können immer noch keine Beiträge erstellt werden.
Der Text ist weiß auf weiß.

10.06.2024 - 03:51 Uhr

Natürlich muss man in WPF nicht alles mit MVVM machen. Vor allem für jedes kleine Tool was man baut finde ich das overkill (ist meine Meinung).

Ich hab mal ein bisschen was umgebaut.

Ich finde den Code nicht gut...

Warum das bild immer abspeichern? Warum die List eimmer aktualisieren, auch wenn sich z.B. nichts geändert hat, ...
Das geht sicher besser.

Ich würde eher eine ListBox mit einem Itemtemplate nehmen, als die Items im Code zu erzeugen, aber geht alles.

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Security.Policy;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;

namespace WpfApp1
{
    class RunningApp
    {
        public string Name { get; set; }
        public string Path { get; set; }
        public string IconPath { get; set; }
        public IntPtr Handle { get; set; }
    }

    public partial class MainWindow : Window
    {
        private Timer timer;

        [DllImport("user32.dll")]
        private static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);

        public MainWindow()
        {
            InitializeComponent();

            string iconPath = System.IO.Path.Combine(System.IO.Path.GetTempPath());
            if (!Directory.Exists(System.IO.Path.GetDirectoryName(iconPath)))
                Directory.CreateDirectory(System.IO.Path.GetDirectoryName(iconPath));

            this.timer = new System.Timers.Timer();
            this.timer.Interval = 500;
            this.timer.Elapsed += Timer_Elapsed;
            this.timer.AutoReset = false;
            this.timer.Start();
        }

        private void Timer_Elapsed(object? sender, ElapsedEventArgs e)
        {
            var lst = new List<RunningApp>();

            Parallel.ForEach(Process.GetProcesses(), p =>
            {
                try
                {
                    string processPath = String.Empty;
                    processPath = p.MainModule.FileName;
                    if (!string.IsNullOrEmpty(p.MainWindowTitle))
                    {
                        string iconPath = System.IO.Path.Combine(System.IO.Path.GetTempPath(), "cache", p.MainWindowHandle.ToString());
                        if (!Directory.Exists(System.IO.Path.GetDirectoryName(iconPath)))
                            Directory.CreateDirectory(System.IO.Path.GetDirectoryName(iconPath));
                        if (!File.Exists(iconPath))
                        {
                            Icon icon = System.Drawing.Icon.ExtractAssociatedIcon(processPath);
                            icon.ToBitmap().Save(iconPath);
                            icon.Dispose();
                        }
                        lst.Add(new RunningApp()
                        {
                            Name = p.MainWindowTitle,
                            Path = processPath,
                            IconPath = iconPath,
                            Handle = p.MainWindowHandle
                        });
                    }
                }
                catch (Exception)
                {
                }
            });

            Dispatcher.Invoke(() =>
            {
                OpenProgramms.Children.Clear();
                foreach (var app in lst.OrderBy(x => x.Name))
                {
                    Button button = new Button()
                    {
                        Content = new System.Windows.Controls.Image
                        {
                            Stretch = Stretch.Fill,
                            Source = new BitmapImage(new Uri(app.IconPath))
                        },
                        Tag = app.Handle,
                        ToolTip = app.Name
                    };
                    button.Click += Button_Click;
                    button.Width = 50;
                    button.Height = 50;

                    OpenProgramms.Children.Add(button);
                }
            });
            this.timer.Start();
        }

        private void Button_Click(object sender, EventArgs e)
        {
            const int SW_RESTORE = 9;

            IntPtr handle = (IntPtr)((Button)sender).Tag;
            bool retValue = ShowWindowAsync(handle, SW_RESTORE);
        }
    }
}
07.06.2023 - 12:59 Uhr

Vlt ein msbuild issue. Mach doch mal ein issue bei https://github.com/dotnet/msbuild auf.

Beste ist dort wenn du ein beispiel hast, das man es nachstellen kann.

Ich hatte auch schon Fehler in msbuild, nur werden bei mir zu viel files kopiert: https://github.com/dotnet/msbuild/issues/8319

28.05.2023 - 07:03 Uhr

Vlt. hilft das: https://serverfault.com/questions/980215/asp-net-core-site-has-the-wrong-default-culture-when-run-with-iis

04.01.2023 - 20:13 Uhr

auch wenn statt der exe eine dll verwendet wird, brauchst du eine linux dll die zu deiner platform passt. Also so einfach wirds erstmal nicht klappen. Glaube da ist es einfacher ffmpeg passend im container zu installieren und dieses durch den wrapper aufrufen zu lassen.
Denn Pfad zu der Binary kann man ja übergeben.

siehe auch: https://github.com/cmxl/FFmpeg.NET/issues/34

13.11.2022 - 16:46 Uhr

Hast du das Video angeschaut?

Es wird aus dem proto Contract gleichzeitig auch eine REST API erzeugt die du per Put/Get/Post.... nutzen kannst. Es wird aus dem Proto Contract eine OpenAPI definition erstellt, und auch eine SwaggerUI erzeugt. Das dies nicht für alle API Befehle geht, zumindest nicht in den der Server dann proaktiv was sendet ist mir klar.

Mir ist schon klar das der Kunde der Rest bzw. die HTTP API und nicht den GRPC Teil nutzt keinen Rückkanal hat.
Aber das ist okay für mich.

Firewallprobleme sind für mich auch kein Thema, unsere ganze Software läuft sowieso nur intern beim Kunden.

Wenn Du eine Json Schnittstelle durch RPC generierst, dann ist es eine Json RPC API und keine REST API.
Warum? Wenn die API die Rest Anforderungen erfüllt. (Representational State Transfer#Prinzipien)

13.11.2022 - 10:35 Uhr

https://www.youtube.com/watch?v=et_2NBk4N4Y

Denke das hab ich gesucht.
Ich kann mit gRPC eine RPC Kommunikation machen, gleichzeitig aber auch eine Rest API zur verfügung stellen. ("Create RESTful services with gRPC JSON transcoding")

30.10.2022 - 23:24 Uhr

WebHook sind sehr beliebt, einfach zu implementieren; aber sind nicht für sofortiges Real Time-Verhalten gedacht.
Womöglich passt das aber besser zu Deinem eher simple gewünschten Verhalten; WebSockets sind womöglich "zu oversized" für Deinen Fall.

Ja, die Performance der Antwort ist nicht wirklich relevant, nur das wir überhaupt benachrichtigen können.
Vlt. bieten wir dann ja auch beides an.
Was ist den der Unterschied zwischen Callbacks und Webhooks?

30.10.2022 - 10:01 Uhr

Mir geht es halt hauptsächlich darum das wir die API in C# Entwickeln können, und das ganze auch zur Doku verwenden können.
Ja normalerweise sollten wir die API schön planen und dann danach entwickeln, aber so läufts bei uns leider meist nicht.

Hab jetzt noch das gefunden: https://github.com/OAI/OpenAPI-Specification/issues/55 Scheint es gibt mehrere die Swagger gerne auch zur doku von websockets hätten.

Aber das hört sich für mich am interessantesten an: https://github.com/OAI/OpenAPI-Specification/issues/396
Server Sent Events. Sind diese auch in Swashbuckle oder NSwag integriert?

=> update, hab das völlig falsch gelesen, dachte Server Sent Events wären in Swagger, sind es wohl aber nicht.

Nochmal Editiert:

Aber swagger erlaubt wohl Callbacks:
https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#callbackObject
https://swagger.io/docs/specification/callbacks/

29.10.2022 - 10:03 Uhr

Ja, da wollte Ich eben wissen, was ist state of the art.
Wir machen eben gerade die HTTP/REST Schnittstelle neu, mit Swagger UI, Automatischer Doku usw... Weil das vorher was wild zusammengestriktes war. Eine Schnittstelle die HTPP oder TCP oder Dateibasiert konnte, nichts gut, schlecht dokumentiert usw...

Mir geht es halt auch um die Dokumentation, mit Swagger bekomme ich eine schöne Doku und Testumgebung für die eine Richtung sofort.

29.10.2022 - 01:24 Uhr

Nochmals,
wir haben ein WMS, welches eine Standard HTTP (ob wir nun genau Rest haben oder nicht) Schnittstelle bietet. Dadurch kann das überlagerte System bei uns Aufträge einstellen, Materialien anlegen usw.
Das reicht auch für viele Kunden.

Viele brauchen aber auch einen Rückkanal wenn z.B. ein Auftrag fertig gestellt wurde.
Wie würdet Ihr diesen bauen?
Ein Kunde z.b. will jetzt das wir nun wiederum seine Rest API aufrufen. Dies passt aber nicht zu unserem Standard Interface da dies bei jedem Kunden anders wäre
Bei anderen haben wir es im Moment so, das sie ständig per Get Pollen ob es neue Antworten gibt. (Das haben wir in unserer Standard HTPP Schnittstelle so drin, gefällt uns aber eben nicht wirklich.

Daher war die Frage wie würde man den Rückkanal implementieren.

Wir brauchen kein LoadBalancing oder ähnlichen Schnickschnack, an der Schnittstelle hängt maximal 1 Client, also High Perfomance Szenarien brauchen wir nicht supporten.
Wichtig ist uns das wir es Standardisiert haben, das wir bei klein Projekten dem Kunden diese Schnittstelle bieten können, aber ohne Anpassungen.

28.10.2022 - 19:57 Uhr

Und wie gibst du in ObjectResult oder CollectionResult den Typ mit?
Also wenn es nicht als Antwort auf ein POST/GET kommt sondern über den Websocket Kanal?
Ich muss ja dann wissen was es für ein Typ ist.

28.10.2022 - 12:24 Uhr

Nochwas, was ist eig. besser, moderner, besser gepflegt.

NSwag oder Swashbuckle?

28.10.2022 - 12:22 Uhr

Und wieso MetaInformationen nicht in den Header?

Dann muss Ich mein Json Antworktobjekt ja nochmals in ein Zusätzliches mit Metainformationen packen

28.10.2022 - 12:20 Uhr

D.h. die API aber trotzdem Per PUT/GET/POST?

Und per Websocket nur den Antwortkanal?

Ich meine wenn ich per GET die Url für eine Antwort auslese, bleibt der Request so lange offen bis entweder eine Antwort kommt oder die Anfrage einen Timeout hat

28.10.2022 - 10:50 Uhr

Wir haben für unser WMS System als Schnittstelle eine Http/Rest Schnittstelle mit Swagger Interface.
Nun ist für mich die Frage, was ist die beste Möglichkeit für einen Rückkanal.

Im Moment wurde es so entwickelt, es gab einen GET Aufruf mit dem man die Antworten abgerufen hat, und diese hat im Header auch noch gesagt ob es weitere gibt.
Und Wenn keine Antwort vorlag, hat der Aufruf so lange blockiert bis eine weitere eingetragen wurde (Long Polling).

Was ist da gerade so state of the art?

12.09.2022 - 12:58 Uhr

Was man auch noch beachten muss, DateTimeOffset braucht 2Byte Speicher mehr als DateTime, da es intern eine DateTime Struktur und ein Int16 für das Offset verwendet.

Hier ist auch noch beschrieben das es mit DateTimeOffset auch noch Probleme gibt:
TimeZones and DateTimeOffset · Issue #360 · dotnet/runtime

13.06.2022 - 08:21 Uhr

Vielleicht ist LINQ2DB ein wenig schneller, aber rechtfertigt dieser Vorteil, dass man auf EFCore mit allen seinen Vorteilen und Change Tracking (was man auch abschalten kann) verzichten muss?
Ganz ehrlich: Dieses Framework bildet den Kern der Anwendung, der sollte sitzen und da setze ich lieber auf EFCore, das weit weit umfangreicher getestet ist, weil es ungefähr überall genutzt wird.

Kommt halt darauf was für features man braucht. Und es gibt eben noch andere Frameworks als EF-Core, das wollte ich eben erwähnen.
Auch linq2db ebenso durch tausende Tests abgedeckt.
Ich hatte (es zumindest früher), häufig so das ich viele features in SQL nicht mit EF-Core als linq abbilden konnte. Da war zu der Zeit linq2db weiter (Merge, Window Functions). Weiß nicht wie da der aktuelle Stand mit EF-Core ist, wir haben uns EF-Core dann nicht mehr angeschaut.

12.06.2022 - 12:18 Uhr

Wenn es rein um die Perfomance geht, oder du einfach nur einen ORM Mapper für Typisierte SQL Abfragen brauchst, kann ich auch noch linq2db empfehlen (https://github.com/linq2db/linq2db). Das bietet Typsicheres SQL via Linq wie EFCore auch, aber häufig ein klein bisschen performanter, jedoch auch mit weniger features (wie z.b. kein Change Tracking)

11.05.2022 - 10:41 Uhr

Ein "Tag" braucht bei uns ca. 500 Bytes als Leeres Objekt (durch die Verschiedenen Properties die wir im Tag haben (Min/Max Value, Scripte, ...)). Das ist aber noch ohne Strings wie dem Tag Namen und der Adresse. D.h. wenn ich 1.5mio tags habe, welche im speicher sind, dann habe ich alleine dafür knapp 1GB speicher, da ich aber noch strings wie Name, Adresse und Beschreibung habe, komme ich auf ca 1.5GB.

Das ganze funktioniert ja so auch, ich überlege einfach nur was, und ob ich es reduzieren kann oder soll.

Ein Tag hat bei uns z.b. über 30 Properties wo man ihn konfigurieren kann, wie archivierung, meldung erzeugen, usw...

11.05.2022 - 10:14 Uhr

Hallo,

wir haben eine Applikation, ein Visualisierungssystem für PLCs.

Aus Performance Gründen halten wir immer alle aktuellen werte als Klasse im Speicher. Dadurch das wir Visualiserungen haben mit mehr als 1,5 Mio Variablen, haben wir einen ganz schönen Speicherverbrauch.
da ja jede Variable durch eine Klasseninstanz repräsentiert wird.

Nun bin ich am überlgen das ganze etwas zu reduzieren, dazu ein paar fragen:

  • Was braucht ein leeres Feld vom Type "object" einer Klasse im Speicher? Ich würde im Moment mal auf 8 Byte tippen, oder täusche ich mich da?
  • Was braucht ein Bool? Würdet Ihr es als sinnvoll erachten mehrere Bool's in eine Flags enum zu verstecken (nur zur speicheroptimierung?)
03.05.2022 - 10:29 Uhr

NUn gehts...



          const string systemLinqQueryableName = "System.Linq.Queryable";
            var systemLinqQueryableAssembly = Assembly.Load(systemLinqQueryableName);
                MetadataReference.CreateFromFile(AssemblyLoader.AssemblyLoader.GetAssemblyPath(systemLinqQueryableAssembly)),

03.05.2022 - 10:15 Uhr

Hallo,

wir verwenden in unserer Applikation Roslyn um dynamisch Code zu kompilieren...

Nun bekomme ich bei folgender Klasse:


using MCC.Common.ServiceInterfaces.DTO.CacheableQuery;
using MCC.VISU.DL;
using MCC.VISU.Services.VisuServiceInterfaces.DTO;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Globalization;
using LinqToDB;
using System.Linq.Dynamic.Core;

namespace CachableQuery
{
    public class REPORT_SrmStatictisQuery : ICachableQueryScript
    {
        public object Run(object[] parameters)
        {
            DateTime @from = DateTime.Now; // (DateTime)parameters[0];
            DateTime to = DateTime.Now; //(DateTime)parameters[1];


            using (var db = new VisuDb())
            {
                var retVal = new List<Data>();

                var tagsQry = db.Tags.Where(x => Sql.Like(x.Name, "SRM.%.ServiceData.%"));
                var p = Expression.Parameter(typeof(TagDTO));

                if (parameters[2] != null)
                {
                    var srmNames = ((string)parameters[2]).Split(',');
                    Expression e = Expression.Call(Expression.Property(p, "Name"), typeof(string).GetMethods().First(x => x.Name == "StartsWith" && x.GetParameters().Length == 1), Expression.Constant("SRM." + srmNames[0] + ".ServiceData."));
                    foreach (var nm in srmNames.Skip(1))
                    {
                        e = Expression.Or(e, Expression.Call(Expression.Property(p, "Name"), typeof(string).GetMethods().First(x => x.Name == "StartsWith" && x.GetParameters().Length == 1), Expression.Constant("SRM." + nm + ".ServiceData.")));
                    }
                    tagsQry = tagsQry.Where(Expression.Lambda<Func<TagDTO, bool>>(e, p));
                }

               ....

                return retVal;
            }
        }
    }
}


den Fehler:

Fehlermeldung:
: "REPORT_SrmStatictisQuery.cs(66,45): error CS1503: Argument 2: cannot convert from 'System.Linq.Expressions.Expression<System.Func<MCC.VISU.Services.VisuServiceInterfaces.DTO.TagDTO, bool>>' to 'System.Func<MCC.VISU.Services.VisuServiceInterfaces.DTO.TagDTO, bool>'"

Problem ist, in Visual STudio kann er die Klasse ohne Probleme übersetzen. Aber irgendwie findet er die Implementierung in der Queryable Klasse nicht wenn ich Roslyn selber starte.

Als wir Roslyn noch aus dem Net-Framework 4.8 aufgerufen haben hat das so funktioniert. Seit wir nun auf netcore 6 sind geht es nicht mehr...

Mein Roslyn Aufruf sieht ungefähr so aus:


  var st = SourceText.From(code.ToStream(), Encoding.UTF8, canBeEmbedded: true);
            SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(st,
                new CSharpParseOptions(kind: SourceCodeKind.Regular, languageVersion: LanguageVersion.Latest), path: codefileName);
            string assemblyName = Path.GetRandomFileName();

            var emitOptions = new EmitOptions(debugInformationFormat: DebugInformationFormat.PortablePdb );
            var embeddedTexts = new[] { EmbeddedText.FromSource(syntaxTree.FilePath, syntaxTree.GetText()) };

var references = new List<MetadataReference>()
            {
                MetadataReference.CreateFromFile(AssemblyLoader.AssemblyLoader.GetAssemblyPath(systemCollectionsAssembly)),
                MetadataReference.CreateFromFile(AssemblyLoader.AssemblyLoader.GetAssemblyPath(systemRuntimeAssembly)),
                MetadataReference.CreateFromFile(AssemblyLoader.AssemblyLoader.GetAssemblyPath(netstandardAssembly)),
                MetadataReference.CreateFromFile(AssemblyLoader.AssemblyLoader.GetAssemblyPath(systemComponentModelAssembly)),
                MetadataReference.CreateFromFile(AssemblyLoader.AssemblyLoader.GetAssemblyPath(typeof(object).Assembly)),
                ....
            };

            if (neededAssemblys != null)
            {
                foreach (var neededAssembly in neededAssemblys)
                {
                    references.Add(MetadataReference.CreateFromFile(AssemblyLoader.AssemblyLoader.GetAssemblyPath(neededAssembly)));
                }
            }

  var compilation = CSharpCompilation.Create(
                assemblyName,
                syntaxTrees: new[] { syntaxTree },
                references: references,
                options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary,
                    optimizationLevel: OptimizationLevel.Debug));

            using (var ms = new MemoryStream())
            using (var msPDB = new MemoryStream())
            {
                EmitResult result = compilation.Emit(ms, pdbStream: msPDB, options: emitOptions, embeddedTexts: embeddedTexts);


hat jemand ne idee?

25.04.2022 - 19:27 Uhr

Es ist durch den compatibility mode aber erlaubt.

Port from .NET Framework to .NET 6 - .NET Core

zumindest unter windows.

01.04.2022 - 10:08 Uhr

Muss es denn ein Trigger sein oder kannst du dich auch an die Events hängen?

Dann kannst ja einfach sowas


public static IEnumerable<T> FindVisualChilds<T>(DependencyObject depObj) where T : DependencyObject
{
    if (depObj == null) yield return (T)Enumerable.Empty<T>();
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
    {
        DependencyObject ithChild = VisualTreeHelper.GetChild(depObj, i);
        if (ithChild == null) continue;
        if (ithChild is T t) yield return t;
        foreach (T childOfChild in FindVisualChilds<T>(ithChild)) yield return childOfChild;
    }
}

von https://stackoverflow.com/a/978352/579623

verwenden und alle PathGeometrys suchen

01.04.2022 - 10:04 Uhr

Fand diese Info zu Blazor nun auch Interessant: Es wird keine direkte DragDrop Unterstützung innerhalb des Frameworks von MS geben - Microsoft Won't Do Drag-and-Drop for Blazor -- Visual Studio Magazine

04.03.2022 - 10:54 Uhr

Dachte für dieses Problem gibts vlt. schon was im Framework (oder was in die Richtung).

Überlege ob es eine Möglichkeit gibt das ohne Lock zu implementieren...

04.03.2022 - 10:49 Uhr

Mein Kollege hatte mal das Programmiert:


    public class ThreadControl : IDisposable
    {
        private readonly object _wakeUpLock = new object();

        private readonly Action _workerThreadLoop;

        private readonly Timer _workerThreadWakeupTimer;

        private volatile bool _go;

        private volatile bool _stopThread;

        private Thread _workerThread;

        public WorkerThreadControl(Action workerThreadLoop)
        {
            _workerThreadLoop = workerThreadLoop;
            _workerThreadWakeupTimer = new Timer(state => WakeUpTimer(), null, -1, -1);
        }

        public void Dispose()
        {
            lock (_wakeUpLock)
            {
                _stopThread = true;
                Monitor.Pulse(_wakeUpLock);
            }

            if (_workerThread != null && !_workerThread.Join(5000))
            {
                _logger.Warn(GetType().Name, "Worker Thread stop did not respond...");
                _workerThread.Abort();
                _workerThread.Join();
                _workerThread = null;
            }
        }

        public void StartInternal()
        {
            if (_workerThread == null)
            {
                _workerThread = new Thread(() => _workerThreadLoop());
                _workerThread.Start();
            }
        }

        public void Wait(int timeout, out bool stop)
        {
            lock (_wakeUpLock)
            {
                while (!(_stopThread || _go))
                {
                    _workerThreadWakeupTimer.Change(timeout, -1); // start
                    Monitor.Wait(_wakeUpLock); // Lock is released while we’re waiting
                    _workerThreadWakeupTimer.Change(-1, -1); // stop
                }

                stop = _stopThread;
                _stopThread = false;
                _go = false;
            }
        }

        public void WakeUp()
        {
            Task.Factory.StartNew(() =>
            {
                lock (_wakeUpLock)
                {
                    _go = true;
                    Monitor.Pulse(_wakeUpLock);
                }
            });
        }

        private void WakeUpTimer()
        {
            lock (_wakeUpLock)
            {
                _go = true;
                Monitor.Pulse(_wakeUpLock);
            }
        }
    }

Ich denke das geht doch bestimmt einfacher.

Auch Thread.Abort sollte raus, geht in Netcore eh nicht mehr. Und denke wir brauchen auch keinen extra Thread

Nur über den ThreadingTimer, ich kann zwar die Zeit auf 0 setzen, aber was passiert wenn der Timer gerade läuft? Woher weiß ich wann ich die Zeit hochsetzen muss.

04.03.2022 - 08:06 Uhr

Hallo,

bin auf der Suche nach einer speziellen Klasse, bzw. wir haben schon eine wollte aber wissen, vlt. gibt es sowas ja direkt im Framework.

Wir haben eine Action welche in bestimmten Intervallen aufgerufen werden muss. Glkeichzeitig brauche Ich auch einen externen Call, (z.b. WakeUp) der die Action, wenn Sie gerade nicht läuft, sofort startet. Dieser WakeUp kann mehrmals während die Action läuft aufgerufen werden, soll die Action danach aber nur ein mal noch Triggern. Diese soll aber sofort getriggert werden, und nicht erst wenn der timer wieder abgelaufen ist.

Ein Kollege von mit hat das vor Jahren recht kompliziert implementiert, nun wollte Ich Fragen gibts da direkt was oder muss ich das selber bauen. Möchte es auf jeden fall vereinfachen.

24.02.2022 - 09:18 Uhr

Hallo,

wir haben bei uns eine sehr große Solution, mit einer Host exe welche assemblies dynamisch nachladen kann. Damit die dynamischen assemblies alle vor der Host exe gebaut werden, wurden diese in der Solution unter "Projektabhänigkeiten" als abhänigkeit für das Hauptprojekt definiert.
Die Dynamisch geladenen Assemblies werden aber in ein anderes Verzeichnis compiliert als die host exe.

Nun haben wir folgendes Problem, ein paar der subassemblies haben dateien welche im Projekt auf "copy always" stehen. Nun werden diese dateien auch in das Verzeichnis der "host" assembly kopiert. Jemand eine Ahnung wie man das verhindern kann?

07.02.2022 - 00:01 Uhr

Ganz so schlimm ist es nicht, aber das RegexLab-Tool hilft nicht immer weiter, manches muss ich da probieren. Tatsächlich funktioniert es jetzt wie gewünscht bis auf eine kleine Kleinigkeit:
Absatzübergreifend findet er den Text auch jetzt nicht. Das dürfte an dem '\s+' liegen, denn in den Absatzumbrüchen stehen Sachen wie '<div> </div>' oder '<br>', eben keine WhiteSpace-Zeichen. Die könnte ich natürlich auch noch 'rausnehmen, aber das wird aufwendiger als nötig.

Was willst du denn genau machen? Vlt. wäre ja ein HTML (wie AngleSharp) parser besser geeignet

04.02.2022 - 21:07 Uhr

Dein Basis Usercontrol darf kein XAML definieren.

how-can-a-wpf-usercontrol-inherit-a-wpf-usercontrol

Sicher das du überhaupt Usercontrol und nicht lieber CustomControls erstellen willst?

Siehe: https://www.wpftutorial.net/customvsusercontrol.html

02.02.2022 - 22:41 Uhr

das habe ich schon gelesen, dachte du hättest deinen Blog post auch verlinkt gehabt, und ich hätte den link übersehen.

Vlt. solltest in deinen Post auch noch Avalonia aufnehmen. Scheinen ja doch auch ein paar Industriegrößen zu supporten.

02.02.2022 - 15:04 Uhr

Hast du die passende
>
bei dir installiert?
Ansonsten schau mal in
>
.

Ups, sorry, nein...
Hab aber gestern keine Zeit zum testen mehr gehabt.
Sind alle installiert, hat also nicht geholfen.

02.02.2022 - 00:30 Uhr

Das gleiche hab ich nen paar Beiträge weiter vorn geschrieben...

sicher?? hab jetzt nochmals alle durchgeschaut.

PS: bitte nich für jeden Satz ein Beitrag schreiben.
Du kannst 30 Minuten lang Beiträge editieren, um noch was hinzuzufügen.

werde ich beim nächsten mal berücksichtigen, für die Antwort jetzt hab ich trotzdem eine extra erstellt.

Und hast dir mal das Video zu WPF Local angeschaut, damals hatten Sie (gefühlt) noch mehr mit WPF vor.

02.02.2022 - 00:24 Uhr

Hab Avalonia ja schon Jahre nicht mehr angesehen. Was mir da sofort gefallen hat (das was ich bei WPF vermisse...):

https://docs.avaloniaui.net/docs/data-binding/converting-binding-values - einfaches negieren von Bindings, ohne Converter

auch nicht schlecht: https://docs.avaloniaui.net/docs/data-binding/compiledbindings, aber das UWP (und glaube WinUI3, oder?) ja auch. (wobei in WinUI3 der Perf. Vorteil durch PInvoke ja wahrscheinlich weg ist, aber Compile Time Fehler sind ja immer noch ein Vorteil, aber das werden wir ja sehen wenn es mal Released ist)

02.02.2022 - 00:12 Uhr

Von Telerik gibts auch noch ein Blog Post:

https://www.telerik.com/blogs/how-to-desktop-2022

Die haben Avalonia sogar mit drin.

02.02.2022 - 00:09 Uhr

@Abt : Der Blog Post von dir fasst ja alle MS Technologien und den Entwicklungsstand gut zusammen: Die .NET UI Technologieübersicht 2022 - SchwabenCode.com | Benjamin Abt

Hat sich jemand auch das schon mal angeschaut:
Avalonia UI

Die konnten schon vor einer ganzen weile ja den UI Code von AvalonEdit nahezu übernehmen. Und das wir auch von ILSpy für eine Win/MacOS/Linux UI benutzt.

01.02.2022 - 21:46 Uhr

Achso das Video von MS über WPF lokal:

Connect Live WPF Team – ConnectLive Live Q&A - YouTube

habs leider selbst nicht mehr gefunden, musste bei MS nachfragen:

WPF Local Versions · Discussion #6038 · dotnet/wpf

01.02.2022 - 21:44 Uhr

Was heißt evaluieren? Ich kann ja nicht jede UI Technologie probieren. Darum frage Ich hier ja. Ich habe mich schon ein bisschen mit Blazor beschäftigt, und mir gefällt es im Moment nicht so wirklich. Das kann ja meine Meinung sein.
Ja ich habe noch nichts damit entworfen. Ab WPF zu nutzen, um einen Browser zu hosten, um darin Blazor Komponenten zu verwenden, nein gefällt mir im Moment nicht. Wenn das anders funktioniert, okay dann hab ich es falsch verstanden.

Ich freue mich ja auch das ich hier hinweise bekomme, was es gibt, aber im Moment sagt mir von den neuen Dingen noch nicht wirklich was zu.

Daher mal die Frage, nutzt jemand schon WinUI3 Produktiv? Nutzt jemand Blazor in WPF Produktiv? Gibt es sonst noch was von MS was man z.Zt einsetzt?

01.02.2022 - 14:57 Uhr

Hat eigentlich hier schon mal jemand WinUI3 probiert und das zum laufen gebracht?

Ich nutze VS2022 Preview, und habe diesen Fehler.

Die Microsoft.ui.xaml liegt natürlich auch nicht im Verzeichnis, wo liegt die normal?

01.02.2022 - 14:43 Uhr

Nein hab ich nicht. Wie gesagt der Tag hat nur 24h und ich kann nicht alles prototypen, probieren, etc.
Ich hab mir nur kurz das angeschaut: https://www.telerik.com/blogs/blazor-wpf?kw=&cpn=13355944691&&utm_source=google&utm_medium=cpc&utm_campaign=blazor-trial-search-bms-EMEA&ad_group=Blazor+DSA&utm_term=DYNAMIC+SEARCH+ADS&ad_copy=&ad_type=search_DSA&ad_size=DSA3_blazor-dsa_D1-deliver-data-centric-blazor-apps-in-half-the-time-with-the-telerik-grid%E2%80%98s-100-plus-features&ad_placement=&gclid=Cj0KCQiA0eOPBhCGARIsAFIwTs61CMH3VEvDs83HWEvS07mcS30gYQlTPJLSe-i8qHWxMVuI-WY-q4kaAsGJEALw_wcB&gclsrc=aw.ds

Und da das gelesen:

Blazor functionality can actually be built right inside your WPF app project—that’s Razor pages with C#/HTML, CSS and, if need be, some JavaScript, all enabling a desktop WPF solution.

Was soll es mir also bringen, ich habe noch größeres Gemisch von Sprachen...

Ich habe, für mich, den großen Nutzen/Vorteil von Blazor noch nicht gefunden.