Laden...

Forenbeiträge von DiViP Ingesamt 27 Beiträge

27.01.2021 - 10:10 Uhr

Was wäre denn ein guter Weg EnvironmentVariablen (keine Secrets) zu definieren, die man nicht einchecken möchte, aber dennoch bequem im VS setzen und beim Debuggen nutzen möchte?

08.11.2019 - 19:22 Uhr

Vielen Dank für die Antwort. Da stimme ich Dir vollständig zu und auf einer grünen Wiese würde der Code nicht benötigt werden.

Es handelt sich hierbei aber um nach C# portierten Code der weiterhin aus einer nativen Anwendung in einem CLR-Host aufgerufen wird. Async und await wird hier nicht möglich sein.
Der Code der nativen Anwendung soll nicht angepasst werden und der aufrufende Thread muss in diesem Fall blockiert werden, bis die Bedingung erfüllt ist bzw. ein Timeout stattfindet.

Konkret in diesem Fall wird damit eine spezielle Semaphore implementiert. Bestimmter Code soll nicht parallel aufgerufen werden. In diesem Fall würde ein Lock mit Timeout ausreichen, aber der Aufrufer darf sich per Parameter darüber hinweg setzen und Code dennoch parallel ausführen. Er muss aber dabei dennoch in der Semaphore erfasst werden, so dass weitere Aufrufer blockiert werden.

08.11.2019 - 16:53 Uhr

Ich brauche eine Methode die solange wartet bis eine eigene Bedingung erfüllt ist oder ein Timeout auftritt. Gibt es da was im Framework bei dem ich eine Bedingung, Intervall und Timeout setzen kann?
Die Funktion sollte auch kein DateTime.Now benutzen, da eine Umstellung der Rechnerzeit die Laufzeit beeinflusst. Alternative wäre Stopwatch was intern auch Datetime benutzt bzw. einen QueryPerformanceCounter, bei dem ich aber nicht weiß ob dieser auch von der Rechnerzeit abhängig ist.
Oder kurz gesagt, wie kann man folgenden Code eleganter umsetzen?

            
public Boolean WaitFor(Func<Boolean> condition, TimeSpan timeout)
{
    var startTime = DateTime.Now;
    do
    {
        if (condition?.Invoke())
        {
            return true;
        }

        Thread.Sleep(100);
    }
    while ((DateTime.Now - startTime) < timeout);
    return false;
}


06.03.2014 - 12:22 Uhr

Hallo,

bei uns in der Firma haben uns bei C# entschieden die öffene Klammer immmer auf eine neue Zeile zusetzen und das auch bei einzeiligen Blöcken immer Klammern gesetzt werden. Wir waren uns einig, dass das so übersichtlicher und besser lesbar ist.

Da wir auch **Javascript **programmieren, wollten wir auch dort Coderegeln festlegen. Leider sind wir uns in diesem Falle nicht mehr so einig, was die Positionierung der Klammern angeht.
Einige sagen das auch hier die öffene Klammer auf eine neue Zeile gehört, da es eben lesbarer ist. Andere sagen, dass die öffene Klammer nicht auf eine neue Zeile soll, weil das die gängige Konvention in Javascript ist.

Die Frage ist also benutzt man im Team bestimmte Coderegeln, weil Sie einen Vorteil bringen, was Übersicht und Lesbarkeit angehen, dann aber auch sprachübergreifend? Oder benutzt man Regeln weil Sie von einer Mehrheit benutzt werden und somit eine allgemeine Konvention darstellen und das je nach Programmiersprache?

mfg

24.07.2013 - 15:04 Uhr

Schau dir mal EditorTemplates an.

Deine Partial "AdressModelControl" musst als EditorTemplate anlegen, dann kannst du in deiner View über @Html.EditorFor(x => x.Address, "AdressModelControl") diese einbinden. Damit sollte das Binding auch funktionieren.

05.03.2013 - 16:38 Uhr

Ich habe nun noch herausgefunden, weshalb wir unter Windows 8 und Windows Server 2012 die Probleme mit dem eigenen AppPool und der ApplicationPoolIdentity haben.

In unserer Anwendung schreiben wir Tracefiles in ein bestimmtes Verzeichnis. Im Gegensatz zu Windows 7 hat die ApplicationPoolIdentity kein Schreibrecht in unserem Logverzeichnis. Durch hinzufügen von IIS_IUSRS mit Schreibrechten auf unser Logverzeichnis funktioniert nun alles unter Windows 8 / 2012, so wie unter Windows 7.

Ist nur sehr ungünstig, warum man dem User diesen Fehler mit "403.14 - Forbidden
The Web server is configured to not list the contents of this directory" mitteilt. Mit einer besseren Fehlerbeschreibung hätte man eine Menge Zeit gespart.

mfg

05.03.2013 - 12:29 Uhr

Vielen Dank für die Antwort.

Spricht eigentlich irgendwas dagegen im eigenen AppPool die Identity auf "LocalSystem "zu setzen ?

05.03.2013 - 11:19 Uhr

@Abt: Ebenso einen Account hinterlegen, mit dem die Anwendung laufen soll! Man verwendet den Standard User vom IIS eigentlich nicht mehr!)

Meinst du damit die ApplicationPoolIdentity ?

Wir haben aktuell das Problem mit der Einrichtung der Site unter Windows 8 / Windows Server 2012. Die Seite wirft ein 403.14 wenn ich einen eigenen ApplicationPool mit der ApplicationPoolIdentity habe. Wenn ich dagegen den DefaultAppPool auswähle oder die Identity beim eigenen AppPool auf LocalSystem bzw. auf einen anderen User mit ausreichend Rechten setze geht alles.
Was mich wundert ist, dass es mit dem DefaultAppPool geht, obwohl dieser in den Einstellungen auch die ApplicationPoolIdentity hat. Ich habe auch schon per ICACLS dem eigenen AppPool alle Rechte gegeben, aber ohne Erfolg.

Alles bis Windows 7 funktioniert. Wenn da ein 403.14 kommt fehlt meist die Registierung von ASP.net also "aspnet_regiis -ir". aspnet_regiis funktioniert aber ab Windows 8 nicht mehr.

Die Googlesuche brachte mich nicht weiter, von daher meine Frage, ob jemand weiß woran das liegt, dass die Seite mit eigenem AppPool und der ApplicationPoolIdentity nicht mehr funktioniert ?

30.04.2012 - 08:49 Uhr

Vielen Dank für die Antwort.

Ich habe mir diesbezüglich auch noch ein Buch studiert und werde nun versuchen, die Tabelle dementsprechend um zu bauen, dass es dem MVC Konzept entspricht.

In dem Buch wurde unter anderem JSON und jQuery verwendet, dass werde ich mir mal genauer anschauen müssen.

mfg

26.04.2012 - 13:57 Uhr

Ich habe einen Controller und eine View, welche eine Tabelle rendert. Der Callback wird aufgerufen, damit die Tabelle mit Daten gefüllt wird. Ein weiterer Callback wird z.B. aufgerufen um festzulegen, welches Script bei "Onclick" auf einer Row ausgeführt werden soll. Das ist ganze ist vergleichbar wie bei WindowsForms, wo man zum Beispiel bei einem Grid ein Event auf DrawCell hat. So dass man während die Tabelle dargestellt wird Einfluss auf die Darstellung hat.

Ich hab mal sehr vereinfacht versucht darzustellen wie das ganze aufgebaut ist.

 // IndexView
 
 var p = new Parameter();
 p.Data = (context) =>
 {
	return Load(context.Site, context.Sort, context.Filter);
 };
 p.DrawCell = (context, model) =>
 {
	return context.View.Html.ActionLink(model.Name, [Action], [Controller], new { id = model.Id} );
 };
 
 @Html.Action("Table", "Table", new { parameter = p })
 

Im TabellenController werden die Parameter in die TempData geschrieben, so dass diese verfügbar sind, wenn die TableView sich selbst aufruft.

// TableController / TableView
 
 Table.Data = parameter.Data(context);
 
@foreach(var item in Table.Data)
 ...
 <td>
	@parameter.DrawCell(context, item);
 </td>
 ...
26.04.2012 - 11:38 Uhr

Vielen Dank für die Antwort.

Das Problem mit mehrfach geöffneten Fenstern/Tabs ist bekannt und auch ein Grund warum wir eine andere Lösung finden wollen.

Die TempData sind in der Session enthälten und das SessionObjekt wird im Controller automatisch gesperrt um den Zugriff zu steuern. Erklärung...
http://tech-journals.com/jonow/2011/10/22/the-downsides-of-asp-net-session-state

Wie meinst du das mit den Parametern an die Tabelle hängen?
Wenn die Tabelle sich wieder selbst aufruft, braucht diese ja die Parameter. Da die Parameter teilweise umfangreich sind und unter anderem Callbacks enthalten, können diese nicht über den QueryString übermittelt werden. Auch ein "ViewState" also die Serialisierung in einem Formfeld ist nicht möglich, da sich die Callbacks sich nicht serialisieren lassen.

Scheinbar ist unser Konzept für die Wiederwendbarkeit von Controls mit MVC so nicht möglich. Aber ich möchte auch nicht für jede Tabelle eigenen Code schreiben. Solche Redunanzen müssen doch vermeidbar sein.

mit freundlichen Grüßen

25.04.2012 - 20:28 Uhr

Hallo,

ich habe eine Frage zu ASP.net MVC.
Es geht dabei um eine Anwendung, welche auf verschiedenen Seiten Daten in Tabellen darstellt. Da die Tabellen alle die gleiche Logik haben werden die Tabellen über einen eigenen Controller und einer View dargestellt. Über Parameter wird der Tabelle die Datenquelle und bestimmte individuelle Eigenschaften übermittelt.
Die Tabelle löst bei der Sortierung oder dem Paging einen Ajax Request aus, so dass nur Teile der Tabelle aktuallisiert werden. Der Request geht dabei direkt an den Tabellen Controller.
Da dieser dann aber die oben genannten Parameter wieder benötigt, wurden diese im TempData-Objekt gespeichert und die entsprechende ID per QueryString übergeben. So kann die Tabelle sich selbst aufrufen, ohne dabei die Datenquelle und die Eigenschaften zu verlieren.

Meine Frage ist, ob es dafür eine bessere Lösung gibt?

Denn die aktuelle Vorgehensweise ist nicht so schön, weil zum einen die TempData bis zum Ende der Session mit Daten belegt sind. Die Seiten und Tabellen sind verlinkt und der User kann hin und her wechseln, von daher ist es schwierig zu ermitteln, ab wann bestimmte Parameter nicht mehr gebraucht werden.
Bei meheren Tabellen auf einer Seite und parallelen Aufrufen der Tabellen blockiert der Controller, da immer nur ein 1 Controller gleichzeitig ausgeführt wird, aufgrund des Zugriffes auf die TempData.

Was ist die beste Lösung um in MVC eigene parametrisierte Controls zu bauen, die sich selbst aktuallisieren können ?

Für eure Hilfe wäre ich sehr Dankbar.

mit freundlichen Grüßen

17.02.2010 - 08:33 Uhr

Wieviel Zeit kost das denn, und muß für jedes Control eine eigene zeitraubende Berechnung durchgeführt werden?

Im Moment sind es nur einfache Berechnungen, also weniger Zeitraubend. Aber nach meiner Planung sollen da noch ein paar Sachen zusätzlich implementiert werden. Letztlich wird wahrscheinlich die Belastung der Systemperformance zu mindestens hier auf meinem alten P4 höchstens 1% ausmachen.
Es ist aber für mich unrelevant, wie viel Auslastung dadurch entsteht. Es geht darum dass überhaupt irgendwas gemacht wird, was unnötig ist, wenn es für den User nicht sichtbar ist. Das Programm läuft später mal im Hintergrund und soll das System nur minimal belasten.

Machst du iwas mit DirectX oderso? Bildverarbeitung bei laufender Kamera und so Geschichten?

Nein. Nur einfache Tabs, mit DGV, Labeln, gezeichnete Graphen auf einem Panel.

16.02.2010 - 14:14 Uhr

Gibtes überhaupt ein Problem, die Controls jedesmal gleich zu aktualisieren, egal ob sichtbar oder nicht?

Die Berechnung kostet Zeit, daher ist es nicht optimal, wenn Sie jedes mal ausgeführt wird auch wenn sie nicht benötigt wird. Ich will die optimale Performance. 😃

16.02.2010 - 12:52 Uhr

Danke für die Antworten.

Das mit dem Paint und Invalidate ist wohl das Beste. Die Idee hatte ich auch schon ist aber mit Aufwand verbunden. Ich hatte da eher an ein Property gedacht, was mir die Sichtbarkeit anzeigt.

Ich werde mal versuchen das mit Paint/Invalidate zu implementieren.

16.02.2010 - 11:31 Uhr

Hallo,

ich habe schon nach der im Betreff stehenden Frage gesucht, konnte aber nichts passendes finden.

Ich habe ein Panel, welches verschiedene Controls (Label, Progressbar) enthält. Diese Controls werden jede Sekunde mit berechneten Daten aktualisiert. Diese Berechnungen bzw. die Controls dienen lediglich der Visualisierung und brauchen daher nicht berechnet und aktualisiert werden, wenn Sie für den User nicht sichtbar sind.
Mit nicht sichtbar meine ich, dass das Control außerhalb des Bildschirms ist, oder überdeckt wird von einem anderen Fenster oder das Fenster selbst minimiert ist.

Wie finde heraus ob ein Control für den User sichtbar ist ?

mfg

02.01.2010 - 12:24 Uhr

Hallo,

beim Laden eines Teiles einer Gesamtdatei tritt ein Fehler auf, wenn die Datei größer ist als 13.241 Bytes. Der Fehler scheint Server abhängig zu sein, da er bisher nur auf BPlaced.net auftritt. Der Fehler tritt auf bei Stream.Close bzw. Response.Close. Wenn man die Datei komplett lädt tritt der Fehler nicht auf.

Fehlermeldung:
Der Remoteserver hat einen Fehler zurückgegeben: 150 1.870 seconds (measured here), 51.35 Kbytes per second\r\n.
InnerException:
Der Vorgang ist für nicht verbundene Sockets unzulässig.

Es folgt der vereinfachte Code mit dem das Problem auftritt.


public static bool DownloadFile(Uri serverUri)
{

FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverUri);
request.Method = WebRequestMethods.Ftp.DownloadFile;
request.ContentOffset = 100;

FtpWebResponse response = (FtpWebResponse)request.GetResponse();

Stream responseStream = null;
StreamReader readStream = null;

responseStream = response.GetResponseStream();
readStream = new StreamReader(responseStream);

Console.WriteLine("Bytes received: {0}", response.ContentLength);
Console.WriteLine("Message from server: {0}", response.StatusDescription);
Console.WriteLine("Resource: {0}", response.ResponseUri);

if (readStream != null)
{
char[] buffer = new char[200];
Console.WriteLine("Bytes: " + readStream.Read(buffer, 0, 200));
}
readStream.Close(); // -> hier tritt die Exception auf
response.Close(); // -> hier tritt die Exception auf
return true;
}

Wenn man die Close Methoden überspringt, kann man ganz normal weitermachen und weitere Dateiteile herunterladen. Nur kann das nicht die richtige Lösung sein.

Weiß jemand eine Lösung ?

28.12.2009 - 16:52 Uhr

Suchst du in etwa sowas wie das Krypton Toolkit. http://www.componentfactory.com/
Das sind ein paar schöne kostenlose Komponenten, welche sich zum Beispiel mit Hilfe von selbst definierten Paletten auch leicht zur Laufzeit im Design ändern lassen.

06.06.2009 - 13:45 Uhr

Was hindert dich daran es auszuprobieren ? 😃

24.05.2009 - 23:55 Uhr

Wie sieht dein Code aus? Kann es sein, dass du die Progressbar in einer Schleife mit einem Wert füllst?
Sollte dem so sein, dann entweder Applications.DoEvent() mit rein oder einen Timer bzw. Events nutzen, ansonsten hat die Form keine Chance sich um sich selbst zu kümmern.

mfg
DiViP

24.05.2009 - 13:10 Uhr

@Coder44:
Du kannst für solche Sachen auch Regex benutzen, was vor allem für aufwändigere Stringoperationen geeignet ist. Ich nutze Regex um bestimmte Informationen aus einer HTML-Seite auszulesen. Nur mit der Stringklasse wäre das ziemlich aufwändig.

mfg
DiViP

23.05.2009 - 23:44 Uhr

Context.Post oder .Send ?

Danke für die Info. Diesen Aspekt hatte ich gar nicht beachtet, ist aber ein sehr schöner Vorteil vom Synchronisation-Context, das man hier die Wahl zwischen asynchron (Post) und synchron (Send) hat. Habe nun den Context in meinem Code auf Send umgestellt, damit der DLL-Thread nicht davon läuft, weil das könnte durchaus passieren, wenn die GUI ein bisschen was zu tun hat. 😃

mfg
DiViP

22.05.2009 - 21:40 Uhr

... die Merhheit der Leute Invoke kennt und dementsprechend deinen Code schneller mit Invoke verstehen wird als mit SynchronisationContext 😃

SynchronisationContext bekommt der User doch gar nicht zu sehen, was genau das Ziel meiner Frage war. Der User bekommt eine Klasse mit einen Eventhandler, welcher die Daten liefert, die angezeigt werden sollen und dieses Event soll frei sein von zusätzlichen Code, welcher nur dazu dient Threadübergreifende Prozesse zu steuern.

22.05.2009 - 21:25 Uhr

Das meinte ich mit "nicht schlüssig" - ich weiß nicht, wo Invoke den Source kompliziert/komplex macht. Ist das nur ein "Gefühl"?

Invoke ist nicht komplex oder kompliziert, es sind aber ein paar Codezeilen mehr. 😉 Ich bin was das angeht Perfektionist und möchte die Formseite so extrem! einfach halten, damit jeder User, die oben angesprochene DLL, ohne viel Aufwand/Wissen nutzen kann. (auch wenn ich in diesem Fall der einzige Nutzer bleiben werde 😃)

So genug, bevor das hier Off-Topic wird. 😃
Danke nochmals.

mfg

22.05.2009 - 20:51 Uhr

Die Erklärung fehlt bzw. ist nicht schlüssig.

Die Erklärung habe ich gegeben. Der Source der Form soll so einfach wie möglich sein. Der Hauptteil spielt sich in einer DLL ab, dessen Ergebnisse in einer Form dargestellt werden sollen.

P.S.: Schau Dir mal SynchronizationContext an.

Das ist es! Danke 😃

Lösung

SendOrPostCallback OnCallback = null;
SynchronizationContext SyncContext;
//...
SyncContext = SynchronizationContext.Current; // wird im Constructor meiner Klasse aufgerufen
//...
SyncContext.Post(OnCallback, State); // wird im fremden Thread aufgerufen

OnCallback kann dann als Event im GUI-Thread verwendet werden und erzeugt dann keine Exception.

Vielen Dank!
mfg
DiViP

22.05.2009 - 19:38 Uhr

@esskar:
Der Thread stellt einen EventHandler bereit, welcher ein Ereignis in der Formklasse auslöst. Dort werden dann die GUI Elemente bearbeitet. Da aber eben dieses Event aus einem anderen Thread ausgelöst wird, entsteht dann eine Exception ohne ein Invoke.

@ujr:
Ich habe die Suche benutzt und die Lösung war immer ein Control.Invoke, welches ich aber, wie ich schon schrieb, nicht nutzen möchte.

22.05.2009 - 18:16 Uhr

Hallo,

Wenn man aus einem fremden Thread GUI-Elemente verändert tritt bekanntlich eine Exception auf, wegen einer threadübergreifenen Veränderung von GUI-Elementen. Dieses Problem könnte man mit Control.Invoke lösen, aber das gefällt mir nicht, da ich die Sources der Form so einfach wie möglich halten will.
Wie ist es möglich, dass der fremde Thread sich darum kümmert, dass ein bestimmtes Event welches GUI-Elemente ändert, innerhalb des GUI-Threades aufgerufen wird. Ich möchte aber nicht dass der fremde Thread Control.Invoke auffruft, da dieser Thread nichts von dem Control wissen soll. Backgroundworker geht auch nicht, da ich diesen fremden Thread nicht selbst starte.
Kann man in einem fremden Thread eine Methode mit Parametern an den GUI-Thread hängen, welche dann innerhalb des GUI-Threades aufgerufen wird?

Ich hoffe meine Erklärung war verständlich. 😃

mfg
DiViP