Laden...
G
GarlandGreene myCSharp.de - Member
Softwareentwickler .NET / ABAP Emmerich, NRW Dabei seit 18.08.2006 497 Beiträge
Benutzerbeschreibung

Forenbeiträge von GarlandGreene Ingesamt 497 Beiträge

16.10.2008 - 16:09 Uhr

nö, eigentlich nicht.

Wie groß ist denn das XML-Dokument, das du da laden willst? Xml erzeugt ja bei der Validierung eine ziemliche Arbeitslast, das kann temporär ziemlichen Speicherhunger bedeuten. Denn das System muss die komplette XML-Struktur in den Speicher laden und anschliessend validieren.

16.10.2008 - 15:58 Uhr

hast du mal versucht, die SP nach Änderung des verfügbaren Speichers für den Server und Neustart des Servers (der Rechner muss nicht neu gestartet werden) aufzurufen?

16.10.2008 - 15:52 Uhr

ich selbst habs wiederum aus dem Blog eines Bekannten (code-inside.de). Der hats wahrscheinlich auch über irgendwelche IP-Buschtrommeln erfahren.

16.10.2008 - 14:55 Uhr

interessant, das Forum hat den Post zwar angenommen, die Threadübersicht aber nicht aktualisiert.

16.10.2008 - 14:51 Uhr

MS hat heute das MVC-Framework als erste Beta veröffentlicht:

Downloadseite ASP.Net MVC Beta

Trotz des geringen Zeitabstands zwischen Preview 5 und Beta gibts noch ein paar kleinere Breaking Changes, die im ebenfalls herunterladbaren Readme zumindest teilweise beschrieben sind.

16.10.2008 - 14:00 Uhr

wie gesagt, die CLR läuft im MemToLeave-Speicherbereich. Der ist anscheinend mindestens 256 MB groß, die Maximalgröße wird aber durch den virtuellen Adressbereich (2 GB) und den darin bereits belegten SQL Buffer-Pool begrenzt. Wenn der Server also die vollen 2 GB nutzen darf und diese in seinem Buffer Pool größtenteils schon belegt hat, bleibt kaum noch was für den Rest.

über die Systemtabelle sys.dm_os_memory_clerks kannst du die Speicherbelegung bekommen. Beispiel:

select type, sum(single_pages_kb + multi_pages_kb + virtual_memory_committed_kb) as kbges  from sys.dm_os_memory_clerks group by type

listet alle Speichertypen im SQL-Server mit ihrer aktuellen Speichernutzung auf. Alternativ kannst du auch den Befehl "dbcc memorystatus" dazu benutzen.

Details zu den gezeigten Werten findest du hier. Wenn ich das ganze richtig verstanden habe, ist die Differenz zwischen VM Reserved und dem, was der SQL Buffer Pool "schluckt" das, was deine CLR zur Verfügung hat.

*forum tret*

16.10.2008 - 13:40 Uhr

Events gibts nicht mehr. MVC setzt nicht auf Webforms, es gibt keinen Viewstate, keine Events. Das ganze ist deutlich näher an andere Web-Frameworks angelehnt als die WebForms-Umsetzung von ASP.Net.

Viele der klassischen ASP.Net-Controls machen daher auch keinen Sinn mehr. Man kann dafür aber sehr viel einfacher selber HTML-Code generieren. ich kann die Blogs von Scott Guthrie und Stephen Walther zu dem Thema nur empfehlen, da finden sich jede Menge nützlicher Infos zum Thema MVC.

Das MVC-Framework wurde heute übrigens als Beta veröffentlicht.

16.10.2008 - 12:29 Uhr

http://blogs.msdn.com/sqlclr/archive/2006/03/24/560154.aspx

SPs in CLR laufen im sog. MemToLeave-Speicherbereich. Der kann je nach Konfiguration gerade mal 256 MB umfassen. In dem Beitrag steht auch, wie man an die Informationen zum freien und gesamten Speicher kommt.

16.10.2008 - 11:33 Uhr

man kann in den Internetoptionen in der Zone "Lokales Intranet" unter "Sites" einstellen, wie der IE Intranetseiten erkennen soll. Man kann da u.a. die automatische Erkennung deaktivieren und mehrere Optionen zur Erkennung aktivieren. Eventuell kann man damit den IE dazu bewegen, die Site als lokale Intranet-Seite zu erkennen.

16.10.2008 - 10:11 Uhr

STRG+E,S

oder Bearbeiten/Erweitert/Leerstelle anzeigen

16.10.2008 - 08:55 Uhr

nein, sicherheitstechnisch wäre das in Ordnung. Ich meinte damit nur, daß es nur eine Umgehung des eigentlichen Problems (weshalb glaubt der IE, er sei nicht im Intranet?) ist.

15.10.2008 - 15:17 Uhr

nee, ne echte Lösung ist das eigentlich nicht. Ich weiß nicht genau, wo und wie der IE zwischen Intranet und Internet unterscheidet. Denn im Intranet benutzt er die automatische Anmeldung, auch für die Sites, die nicht zu den vertrauenswürdigen Sites gehören.

15.10.2008 - 14:19 Uhr

könnte sein, daß der IE glaubt, nicht im lokalen Intranet zu sein, wenn du über den Link die Seite aufrufst. Du könntest die Seite mal testweise zur Liste der vertrauenswürdigen Sites hinzufügen und für diese Sicherheitsstufe die Anmelde-Einstellung (Stufe anpassen, Rubrik Benutzerauthentifizierung, dort "Automatische Anmeldung mit aktuellem Benutzernamen und Kennwort" wählen) anpassen, dann sollte die Abfrage eigentlich nicht mehr erscheinen.

15.10.2008 - 14:14 Uhr

da ein Teil der Arbeit ja von der ActiveX-Bibliothek übernommen wird, könnte diese das Problem verursachen. Wenn das Ding beispielsweise auf Rückmeldung von der AS400 wartet und das tut, indem sie eine Dauerschleife durchläuft, kann das die Prozessorauslastung nach oben treiben und alle weiteren Aktivitäten auf dem Server müssen darunter leiden - auch weitere Aufrufe. Des weiteren könnte es auch sein, daß die ActiveX-DLL ein Problem damit hat, mehrfach aufgerufen zu werden.

15.10.2008 - 14:10 Uhr
  1. case-sensitive. "email" ist nicht gleich "eMail".
  2. this.eMail verweist auf ein Feld oder eine Eigenschaft des Forms, nicht auf eine String-Variable innerhalb der Methode. Wenn du eine Variable willst:

...
string email;
...
email = (result.Properties["mail"].Count > 0) ? (string)result.Properties["mail"][0] : "";
...

15.10.2008 - 12:45 Uhr

ohoh, das sind jetzt aber nichtmal mehr C#-Basics...


this.eMail = (result.Properties["mail"].Count > 0) ? (string)result.Properties["mail"][0] : "";

das Feld oder die Eigenschaft "eMail" muss schon existieren, damit man da was zuweisen kann.

Mal ne Frage: wie willst du dieses Vorhaben denn weiterführen, wenn dir selbst derart extrem simple Kleinigkeiten Probleme bereiten? Denn mit dem Speichern der Mailadresse in ein Feld ist es ja nicht getan, du willst damit ja wahrscheinlich noch was machen.

15.10.2008 - 08:50 Uhr

zum einen:


...
SearchResult result = search.FindOne();
...

zum anderen gibt Page_Load keinen Rückgabewert zurück (die Methode hat den Rückgabetyp void). Das

return true;

am Ende der Methode kann daher entfallen.

14.10.2008 - 09:33 Uhr

du brauchst die Oracle Data Access Components (ODAC), die den OleDb-Treiber und einen managed-Treiber enthalten. Siehe: http://www.oracle.com/technology/software/tech/windows/odpnet/index.html

13.10.2008 - 15:32 Uhr

du solltest dir erstmal die absoluten Basics der Programmierung aneignen. DirectorySearcher.FindOne liefert ein Objekt des Typs System.DirectoryServices.SearchResult zurück.

10.10.2008 - 09:21 Uhr

Wie und wo im Code baust du die SQLConnection denn auf? Wenn du die Verbindung global erzeugst und ablegst (z. B. in der Global.asax.cs, also in der HttpApplication-Klasse), ist sie in jeder Aufrufinstanz sichtbar. Wenn du die Verbindung aber innerhalb deines eigentlichen Webdienst-Codes aufbaust und wieder schliesst (wichtig!), sollte es keine Probleme geben.

10.10.2008 - 09:17 Uhr

ja, kannst du. Du fragst über LDAP-Abfragen zuerst den User ab (LDAP-Eigenschaft "mail"), damit erhälst du das User-Objekt (in Form eines System.DirectoryServices.DirectoryEntry-Objekts). Dieses Objekt enthält dann u.a. eine Eigenschaftenliste "Properties" (Typ PropertyCollection). Über die Eigenschaft "memberOf" erhälst du eine Liste der Gruppen, denen das Konto zugeordnet ist.

Beispielcode:


		public static bool UserHasGroup(string username, string domain, string group)
		{
			bool hasgrp = false;
			string ldapdomain = "LDAP://" + domain.Trim();

			DirectorySearcher dsearch = new DirectorySearcher(ldapdomain);
			dsearch.Filter = "(&(objectClass=user)(SAMAccountName=" + username + "))";
			SearchResultCollection coll = dsearch.FindAll();
			foreach(SearchResult result in coll)
			{
				DirectoryEntry de = result.GetDirectoryEntry();
				string x = de.Name;
				int mcnt = de.Properties["memberOf"].Count;
				for(int propCnt = 0; propCnt < mcnt; propCnt++)
				{
					string dn = (string)de.Properties["memberOf"][propCnt];
					if (dn.IndexOf(group, 0, dn.Length) != -1)
					{
						hasgrp = true;
					}
				}

			}

			return hasgrp;
		}

im Beispiel wird nach dem Anwendernamen (sAMAccountName-Eigenschaft) gesucht, nicht nach der Mailadresse.

06.10.2008 - 21:08 Uhr

aus dem Grund macht man in "richtigen" Projekten, vor allem in Teamarbeit und bei der Entwicklung von Bibliotheken Testbuilds und Releaseversionen. Die Versionsnummer muss man per Hand angeben, die Buildnummer kann man meines Wissens nach hochzählen lassen. Als erstes gilt es aber mal, sich ein Versionierungsschema zu überlegen. Meist läuft es so, daß eine Hauptversion (1.x.y.z) sich nur ändert, wenn umfangreiche Änderungen anstehen, massiv Erweiterungen hinzugekommen sind - oder man das Ding einfach als neue Version verkaufen muss (die Strategie verfolgen so einige kommerzielle Softwareanbieter). Unterhalb der Hauptversion hat man mehr oder weniger freie Hand, sollte sich aber ein klares Versionierungsschema zurechtlegen und sich auch daran halten. So kannst du z. B. die erste Unterversion solange beibehalten, wie eine Bibliothek sich in ihrer Funktionalität und der Schnittstellendefinitionen nicht ändert. Unterhalb dieser Ebene kannst du dann Fehlerkorrekturen versionieren. Das ist aber nur eine Möglichkeit, im Grunde ist das jedem selbst überlassen.

Des weiteren macht es ab einem gewissen Umfang Sinn, auch als Einzelentwickler ein Versionsverwaltungssystem wie CVS oder Subversion einzusetzen. Solche Systeme dienen dazu, Änderungen in Quellcode nicht nur auf einen Server zu synchronisieren, sondern eine komplette Historie aller jemals durchgeführten Änderungen aufzubauen. Man kann jederzeit einen älteren Quellcode-Stand abrufen, den aktuellen Stand mit einer älteren Version vergleichen oder auch komplexere Funktionen wie Branches (das "abzweigen" von einer Version in zwei Entwicklungslinien, die unabhängig voneinander weiterlaufen) nutzen. Tritt in einer neuen Version auf einmal ein Fehler auf, der vorher nie vorkam, kann man sich den älteren Quellcode anschauen und so eventuell einen neu hinzugekommenen Fehler schneller ausmachen.

06.10.2008 - 20:11 Uhr

kommt ein bisschen drauf an, worum es sich handelt und welche Auswirkungen die Fehlerbehebung hätte. Wenn ich es mir vom Aufwand her erlauben kann, den Fehler grundsätzlich auszuräumen und die Projekte, die von der Korrektur betroffen sind oder sein könnten, nachzuziehen, dann mache ich das. Wenn die Korrektur zu weite Kreise zieht, bleibt keine Wahl, als einen Workaround für den Fehler zu suchen. Wenn es sich um eine Bibliothek handelt, sollte es prinzipiell kein Problem geben, wenn man die Versionierung sauber pflegt und in referenzierenden Projekten dann ggf. feste Versionvorgaben zur Bindung macht. So kann ein Altprojekt mit einer älteren Version der Bibliothek im GAC arbeiten, während das neue Projekt die neue, fehlerbereinigte Version benutzt. Diese Versionsvorgabe sollte man natürlich nur benutzen, wenn sie wirklich nötig ist - ansonsten nutzt eine Anwendung immer die zum Release angegebene Version und ggf. später eingeflossene Fehlerkorrekturen kommen hier nie zum Einsatz.

06.10.2008 - 13:44 Uhr

du meinst eine Weiterleitung von domain.tld an www.domain.tld. Das hat mit ASP.Net nichts zu tun, sondern nur mit den DNS-Angaben zur Domain und der Einrichtung des Webservers. Je nach Webserver musst du eine Weiterleitung von domain.tld zu www.domain.tld einrichten. Beim IIS6 macht man das, indem man ein virtuelles Verzeichnis einrichtet, den Hostheader konfiguriert (domain.tld) und als Quellverzeichnis angibt, daß ein Redirect auf die gewünschte URL erfolgen soll. In jedem Fall muss aber ein DNS-Eintrag sowohl für domain.tld als auch www.domain.tld existieren.

03.10.2008 - 18:53 Uhr

prinzipieller Upload in eine Sharepoint-Dokumentenbibliothek: http://www.communardo.de/techblog/2007/05/30/file-upload-in-eine-sharepoint-dokumentenbibliothek-c/

wenn der Benutzer, der hochladen soll, nicht derselbe ist wie der, der die Upload-Anwendung ausführt, muss man sich mit einem anderen Benutzerkonto am Sharepoint-Server anmelden: http://soumya-sharepointblog.blogspot.com/2008/07/sharepoint-elevated-privilege-without.html

für die Sharepoint-Klassen (z. B. SPSite) sind ein paar Sharepoint-Assemblies nötig, die auf dem Sharepoint-Server liegen.

03.10.2008 - 15:54 Uhr

Hi,

Bei den Daten handelt es sich um ZIP-Dateien.
Die Idee mit dem Webservice gefällt mir 🙂

Kann ich mit meiner GUI, die der Kunde bekommt, auf diesen Webservice zugreifen?
Damit werde ich mich mal befassen...

Danke für den Denkanstoß.

Tobias

die GUI sollte ja auch aufs Netzwerk und damit auf Webdienste zugreifen können. Du solltest eventuell darauf achten, daß deine Anwendung auch auf die Verwendung eines Proxyservers mit oder ohne Anmeldung konfiguriert werden kann. Ich weiß nicht, ob die .Net-Komponenten automatisch die im Internet Explorer eingestellten Verbindungsinformationen übernehmen.

03.10.2008 - 15:51 Uhr

ich habe selber noch nicht mit den EnterpriseServices gearbeitet, aber ich gehe davon aus, daß eine Methode, die mit RequiresNew ausgestattet ist, in einem neuen Transaktionskontext ausgeführt wird.

02.10.2008 - 17:54 Uhr

du verstehst da was falsch. Transaktionen im EnterpriseServices-Namespace haben nicht zwangsweise was mit Datenbanken zu tun. Wenn du innerhalb der Methode ein Datenbank-Update ausführst und die Datenbank-Transaktion, in der das Update ausgeführt wurde, commitest, ist die Änderung in der Datenbank - auch wenn danach eine Ausnahme geworfen wird. Man kann das ganze mit Hilfe der EnterpriseServices aber wahrscheinlich so gestalten, daß Datenbankänderungen nur bei erfolgreichem Ablauf der Webmethode auch auf die Datenbank committed werden.

02.10.2008 - 17:33 Uhr

du kannst eine simple Webseite bauen, die eine Datei zum Upload entgegennimmt. Auf Client-Seite kannst du dann per HTTP-Post die Datei hochladen. Da es sich im Prinzip um ganz normalen HTTP-Verkehr handelt, dürfte eine Firewall nichts dagegen haben. Ist nicht ganz unkompliziert, so einen HTTP-Post-Request mit Dateianhang aufzubauen, aber dazu gibts ein paar Howtows im Internet. Vorteil dieser Variante: funktioniert automatisiert und auch manuell über einen Browser.

Oder alternativ (wäre mein Vorschlag): ein Webdienst auf Serverseite, der eine Methode zum Upload von Daten anbietet (also mit Parameter aufgerufen werden kann). Webdienste können HTTP-basiert sein (z. B. ein "normaler" ASP.Net-Webdienst mit .Net 2.0) und sollten auch durch die Firewall hindurch funktionieren. Die Webdienst-Variante ist wahrscheinlich einfacher umzusetzen, da man keine POST-Requests zusammenstricken muss.

Edit: in beiden Fällen sollte der Upload über HTTPS laufen, damit kein aussenstehender die Daten einsehen kann. Zusätzlich solltest du dir das Thema Authorisation anschauen. Wer was hochlädt, sollte sich auch zu erkennen geben, damit sichergestellt ist, daß nur berechtigte Personen oder Dienste Daten hochladen.

22.09.2008 - 22:07 Uhr

dann wäre die darauffolgende Zeile

drawW.clearList();

aber unsinnig, da diese Methode halt nur in der Klasse DrawWindow existiert - oder evtl. das umfangreichere Vererbungsmodell nicht durchdacht ist.

18.09.2008 - 18:25 Uhr

der Fehler 80004005 scheint ein allgemeiner OleDB-Fehler beim Zugriff auf die Datenbank zu sein. Kann zum Beispiel sein, daß der Jet-Provider die Datei unter dem angegebenen Pfad nicht findet, nicht öffnen kann (ist schon geöffnet?) oder darf (Berechtigungsproblem, wenn der ASP.Net-Anwender keine Zugriffsrechte hat).

€: ok, hat sich erledigt.

18.09.2008 - 17:54 Uhr

klappt aber auch mit dem gesamten DataSet. Ich hab das an verschiedenen Stellen so im Einsatz - vordefiniertes typisiertes DataSet, das zur Laufzeit erzeugt, mit Daten gefüllt und an den Report übergeben wird.

13.09.2008 - 16:24 Uhr

Kann es sein, daß CR den TableAdapter benutzt, um die beiden Tabellen abzurufen, eventuell sogar vollständig? Kannst du auf dem MySQL-Server mal den Profiler mitlaufen lassen und dir anschauen, welche Abfragen da beim Test ankommen?

Ansonsten braucht CR beim ersten Aufruf ein paar Sekunden, bis alle Bibliotheken geladen sind. In einem Webdienst hab ich daher mal eine Druckfunktion in einen Thread ausgelagert, damit mir der Webdienst-Client nicht mit Timeout abgebrochen ist.

11.09.2008 - 23:18 Uhr

es ist ganz simpel: es gibt gar keine eindeutige Regelung für die Festlegung des Genus. Das ist teilweise historisch, teilweise sprachlichklanglich bedingt. Beispiel: das Weib. Sächlich, obwohl eigentlich eindeutig weiblich.

Daneben gibt es für Account einen Haufen passender Übersetzungen, von denen du dir diejenige, die dir gefällt, rausgesucht hast. Und selbst wenn es eine eindeutige Übersetzung gäbe, wäre damit die Festlegung des Genus nicht durch den übersetzten Begriff getan. Das ganze ist wie gesagt in der Vergangenheit ohne feste Regelung durch sprachliche Gewohnheit passiert. Die Email (electronic mail, elektronischer Brief) ist da ein ganz gutes Beispiel.

"Der" ist für den Begriff Account ist, soweit es meine Erfahrung betrifft, der am häufigsten (oder: bis ich diesen Thread gelesen hab, einzig) verwendete Genus - von daher behaupte ich, daß er am ehesten "korrekt" ist.

10.09.2008 - 12:38 Uhr

ganz kurzes Beispiel:



        public delegate string TestDelegate(string val);

        public string Test(string val)
        {
            string result = null;
            if (InvokeRequired)
            {
                object retVal = Invoke(new TestDelegate(Test), new object[1] { val });
                if (retVal != null)
                    result = retVal.ToString();
            }
            else
            {
                result = "blub";
            }
            return result;
        }


Aus dem Thread heraus kannst du jetzt Test() aufrufen. Parameteranzahl und Rückgabetyp sowohl für die Funktion als auch den Delegaten müssen natürlich an deine Anforderungen angepasst werden. Test() führt ein Invoke aus, wenn der ausführende Thread nicht der GUI-Thread ist. Die Rückgabe von Invoke ist immer object, also muss man den tatsächlich zurückgegebenen Typen erst wieder casten.

03.09.2008 - 15:37 Uhr

da fehlt evtl. die Definition der Sendemethode:

siehe MSDN


<configuration>
  <system.net>
    <mailSettings>
      <smtp deliveryMethod="network">
        <network
          host="localhost"
          port="25"
          defaultCredentials="true"
        />
      </smtp>
    </mailSettings>
  </system.net>
</configuration>

02.09.2008 - 19:23 Uhr

ohne den Code gelesen zu haben: zum rekursiven Löschen kannst du Directory.Delete(string, boolean) anstelle von DirectoryInfo.Delete() benutzen. Siehe MSDN-Beitrag zu Directory.Delete

02.09.2008 - 19:07 Uhr

bei dem unglaublich guten Support, den MS für das Teil bisher geleistet hat (nur knapp über ein halbes Jahr für den Patch eines kritischen Bugs in einer der zentralen Funktionen, Respekt!), würd ich dem Teil nicht mal ein Temp-Verzeichnis anvertrauen. Ich hab hier zuhause aber auch weniger Bedarf für so ein Teil, hier stehen nur ein Router (WRT54GL mit Tomato-Firmware) und ein Rechner.

01.09.2008 - 22:13 Uhr

so einen Dienst gibts schon. Der Windows Logon-Dienst kann auf Wunsch An- und Abmeldungen in die Ereignisanzeige protokollieren. Diese Protokolldaten kannst du (mit WMI, wenn ich mich nicht irre) auslesen und auswerten.

Pfad zur Protokolleinstellung: Systemsteuerung/Verwaltung/Lokale Sicherheitsrichtlinie/lokale Richtlinien/Überwachungsrichtlinie

Unter Umständen kann man sich auch in die Windows-API einklinken und für Logins und Logoffs ein Ereignis registrieren. Wär zumindest die Richtung, in der ich als erstes suchen würde.

01.09.2008 - 12:38 Uhr

Basic auf dem C64, danach ein paar Grafikdemos in Assembler/MS, ebenfalls C64. Da war ich so 12-14. Ein paar Jahre später dann etwas VBA (mehr oder weniger aus der Not heraus während der kfm. Ausbildung), mit 22 dann"offizieller" Einstieg in den Beruf mit Visual Foxpro.

01.09.2008 - 08:30 Uhr

Hallo,

einen allgemeine Style-Richtlinie gibt es nicht, aber warum eigentlich nicht? Ich persönlich würde mich an Log4Net bzw. Log4J orientieren und das ganze als eine XML-File abspeichern. Der Vorteil bei einer XML-File liegt auf der Hand. XML gibt eine einheidliche Struktur vor und das ganze kann bequem mit einem XML-Viewer, HMTL-Browser, ... betrachtet werden. Zudem könntest du eine Style-Datei ala z.B. CSS mit dran hängen.

Logfiles in XML? Warum nicht gleich einen Text mit TTF-Fonts rendern und als hochauflösende Bitmap im Verzeichnis ablegen? Logfiles sind für Diagnostikzwecke da, die müssen lesbar und vor allem nicht zu aufgebläht sein. Weißt du, wie viel Overhead eine XML-Datei mitbringt?

28.08.2008 - 18:03 Uhr

die ReportProgress-Methode löst nur das ProgressChanged-Event des Backgroundworkers aus. Ob du diese Methode benutzt (und im GUI-Thread dieses Event abonnierst) oder ein eigenes Event implementierst, bleibt dir überlassen. ReportProgress kann neben dem Fortschritt in Prozent auch ein beliebiges Objekt für weitere Detailinformationen zum Fortschritt übergeben, prinzipiell muss man dafür nicht noch ein eigenes Event bauen.

28.08.2008 - 17:43 Uhr

Wenn dann nur das mit den Events ...

Das heißt, wenn ich ein Event in einer Methode auslöse, ist diese Methode dann zu Ende ??? Ich möchte aber z.B. jedes Ergebnis innerhalb einer Schleife per Event an eine Sammel-Klasse melden ... geht das dann also nicht ???

nein, natürlich ist die Methode dann nicht beendet. Das Event wird ausgelöst und die Eventhandler werden ausgeführt. Danach kehrt die Ausführung zum nächsten Prozedurschritt nach der Auslösung des Events zurück. Events sind in diesem Zusammenhang nichts anderes als Methodenaufrufe, bei denen die Anzahl und die Namen der Methoden erst in der laufenden Anwendung ermittelt werden (eben durch Abonnieren eines Events).

Ein Event wird immer in dem Thread abgearbeitet, in dem es ausgelöst wird. Wird in dem Event in irgendeiner Form auf eine Benutzerinteraktion gewartet (darf natürlich nur im GUI-Thread passieren!) oder durch lock() oder ähnliches die Ausführung angehalten, steht dieser Thread und wartet darauf, daß die Blockierung aufgehoben wird. Löst der Thread aber ein Event aus, das durch Invoke() z. B. vom Backgroundworker zum GUI-Thread weitergereicht wird, kann das Event den Backgroundworker nicht mehr blockieren - der Worker löst das Event aus, durch Invoke() wird dieser Aufruf aber in einen anderen Thread verschoben und der Backgroundworker kann sofort weiterarbeiten. Das wäre beispielsweise eine praktikable Methode für deine Anforderung: der Backgroundworker rechnet und sendet in bestimmten Abständen Fortschrittsmeldungen über ein Event an den GUI-Thread, der diese Meldungen dann anzeigt. Dabei aber wie gesagt niemals das Invoke vergessen, ansonsten krachts gegebenenfalls bei der Ausführung.

das ganze trifft übrigens auch bei einem Einkern-Prozessor zu - auch wenn dieser keine echte parallele Verarbeitung beherrschen kann, wechselt das Betriebssystem je nach Priorisierung ständig zwischen den laufenden Threads, so daß diese zwar nicht parallel, aber unabhängig voneinander laufen.

27.08.2008 - 15:28 Uhr

ist die Webseite denn auch korrekt konfiguriert? Hast du mal nachgesehen, ob was in der Ereignisanzeige oder im Webserver-Log steht?

27.08.2008 - 15:27 Uhr

erlaubt die Spalte in der Access-Tabelle denn Nullwerte?

27.08.2008 - 14:52 Uhr

entweder schlägt die Geschichte fehl, weil die interne Konvertierung von Datentyp String (das ist der Datentyp, den ein Textbox-Text hat) zu Double fehlschlägt (Double.Parse müsste mit einem leeren String auch fehlschlagen) oder weil die Tabellenspalte keine Nullwerte erlaubt. Ich tippe bei der Fehlermeldung auf ersteres.

25.08.2008 - 15:38 Uhr

wäre es möglich, daß die Konfigurationseinstellungen deiner Anwendung (Properties.Settings.Default, Standard-Konfigurationseigenschaften des Projekts) auf dem Server nicht existieren?

25.08.2008 - 13:42 Uhr

Hallo,
Wenn es ein Dienst sein muss, würde ich direkt einen echten Dienst schreiben. Wenn es auch ein normales Programm erledigen kann, dann einfach wie GarlandGreene meinte per Task zu einem bestimmten Zeitpunkt das Programm starten (allerdings würde ich den Umweg über den Webservice auslassen).

den Webservice lasse ich in solchen Fällen nicht aus, weil ich damit den Datenbankzugriff über eine einzelne Komponente kapseln kann. Muss ich irgendwann die Datenbank umbauen (sei es ein Serverwechsel, Wechsel der Datenbank oder ähnliches), muss ich nur diese eine Komponente anpassen - alle an diese Komponente angeschlossenen Anwendungen bemerken davon dann nichts.

25.08.2008 - 13:07 Uhr

das macht man normalerweise über einen Webdienst-Client, der dann über den Windows-Zeitplandienst eingeplant wird. Im Prinzip also eine Konsolen- oder WinForms-Anwendung, die selbständig nach dem Start den Webdienst anspricht und damit die gewünschte Aktion auslöst. Hat auch den Vorteil, daß man z. B. die Einplanung sehr einfach ändern oder die Ausführung auch mehrfach täglich planen kann.