Projekt-Anfragen: Tel: 07022/9319004 info@CodeDocu.de Software Entwicklung in C# WPF Asp.Net Core Vba Excel Word SQL-Server EF Linq, UWP Net
#

Problem:

Ich bekomme bei einer Explorer / Dateianwendung einen Deadlock Fehler gemeldet, da die Anwendung unzählige Ordner und Unterordner durchliest. In dieser Zeit ist die Anwendung blockiert. Andere Anwendungen gehen zwar noch,

aber es entsteht zurecht ein gemeldeter Deadlock.

Message: Managed Debugging Assistant 'ContextSwitchDeadlock' has detected a problem in

'C:\Users\Besitzer\Desktop\Desktop Programmierung\onedrive-explorer-win-master\OneDriveApiExplorer\bin\Debug\OneDrive_MultiDrive_Uploader.vshost.exe'.

Additional information: Die CLR konnte 60 Sekunden lang keinen Übergang vom COM-Kontext 0x73ce40 zum COM-Kontext 0x73cfb0 durchführen.

Der Thread, der Besitzer des Zielkontexts/-apartments ist, wartet entweder, ohne Meldungen zu verschieben, oder verarbeitet eine äußerst lang dauernde Operation, ohne Windows-Meldungen zu verschieben.

Eine solche Situation beeinträchtigt in der Regel die Leistung und kann sogar dazu führen, dass die Anwendung nicht mehr reagiert oder die Speicherauslastung immer weiter zunimmt.

Lösung:

Zur Vermeidung dieses Problems sollten alle STA-Threads (Singlethread-Apartment) primitive Typen verwenden, die beim Warten Meldungen verschieben (z. B. CoWaitForMultipleHandles), und bei lange dauernden Operationen generell Meldungen verschieben.


Beim gezeigten Problem kann man das Ausgabe fenster nicht mehr bewegen oder öffnen oder schliessen.

Eigentlich wird die Maschine gar nicht stark belastet, da nur der eine Thread aktiv ist und somit nur eine CPU beim i7 Core gesperrt ist, aber man kann halt genau diese Anwendung nicht mehr verändern oder beeinflussen.

Bei vb.net kann man hier die application.doevents() dazuwischen schalten

Mein Problem entsteht dadurch, dass ich in einem sehr großen NAS Laufwerk alle Ordner und Unterordner durchlaufen lasse.

Ich mache zwar zwischendurch einen Ausgabe.Refresh() aber dieser unterbricht den Thread nicht.

private bool fl_Check_Local_Folders_Structures(string sFolder_long)

{

/// ------------< fl_Check_Local_Folders_Structures() >------------

/// Ermittle alle Dateien und Ordner

DateTime? dtNewest = null;

string[] arrFolders = Directory.GetDirectories(sFolder_long);

for (int iFolder = 0; iFolder < arrFolders.Length; iFolder++)

{

//--< Child.Folder >--

intSync_Folders += 1;

DirectoryInfo objFolder = new DirectoryInfo(arrFolders[iFolder]);

string sPath = objFolder.FullName;

string sFoldername_Short = objFolder.Name;

DateTime dtUtc_Edit = objFolder.LastWriteTimeUtc;

fl_Add_Protocol(intSync_Folders + " " + sPath);

//----<< LOOP: SUBFolders >>----

fl_Check_Local_Folders_Structures(sPath);

//----<</ LOOP: SUBFolders >>----

//--</ Child.Folder >--

}

///----< Ermittle alle Dateien >----

string[] arrFiles = Directory.GetFiles(sFolder_long);

for (int iFile = 0; iFile < arrFiles.Length; iFile++)

{

//--< Child.File >--

FileInfo objFile = new FileInfo(arrFiles[iFile]);

//string sFilename_Short = objFile.Name;

DateTime dtUtc_FileEdit = objFile.LastWriteTimeUtc;

if (dtUtc_FileEdit > dtNewest) { dtNewest = dtUtc_FileEdit; }

fl_Add_Protocol(objFile.FullName);

//--</ Child.Folder >--

}

///----</ Ermittle alle Dateien >----

Lösung 1: (Quick und Dirty) Doevents()

Unter C# in Winforms

Application.DoEvents();

WPF

Einbau eines DoEvents unter WPF und C#: http://www.microsoft-programmierer.de/Details?d=652&a=9&f=106&l=0&t=DoEvents-in-WPF-und-C#

Hierzu muß man folgende DoEvents Funktion einbauen und zwischendurch aufrufen

Und hier die wesentliche Funktion

protectedvoidDoEvents()
{
//----< DoEvents() >----
//* Diese Funktion uebernimmt die Unterbrechnung zur Anzeige und Eventbearbeitung in C#, WPF beim langen Loop Berechnungen
//* mit einer Dispatcher
//* EmptyDelegate im Header definieren
//* using System.Windows.Threading; im Header festlegen

Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.Background,newEmptyDelegate(delegate{ }));
//----</ DoEvents() >----
}

Mobile
»
The await operator can only be used within an async method
»
C#: The return type of an async method must be void, Task or Task T
»
C# Fehler: Control cannot fall out of switch from final case label default
»
UWP: Application Settings, Anzahl und Größe
»
UWP: Der Typname „FromArgb“ ist im Typ „Color“ nicht vorhanden
»
C#: error CS1009: Nicht erkannte Escapesequenz.
»
[OK] VS,UWP,XAML: Der Name ist im Namespace nicht vorhanden
»
C#: Fehlermeldung: CS0535 implementiert den Schnittstellenmember nicht.
»
C Fehlermeldung: Der Typ- oder Namespacename Task wurde nicht gefunden
»
Wie kann ich auf eine Funktion einer anderen Klasse zugreifen

.

Jobs, Projekte, Angebote für Freiberufler, Selbstständig an Info@CodeDocu.de