Lock / Multithreading Problem
-
Hallo,
ich habe folgenden Code und laufe im lock-bereich immer auf einen Fehler!readonly object sync = new object(); public void Serialize(XmlWriter xml, object args) { Action<object> func = delegate(object arguments) { byte[] buffer = new byte[1024 * 10]; MemoryStream ms = new MemoryStream(buffer); string output; TaskArgs taskargs = (TaskArgs)arguments; using (XmlTextWriter xw = new XmlTextWriter(ms, Encoding.Default)) { taskargs.Row.Serialize(xw, taskargs.Line, (SharedStrings)args); xw.Flush(); output = Encoding.Default.GetString(buffer, 0, (int)ms.Position); } lock (sync) { xml.WriteRaw(output); } }; xml.WriteStartElement("sheetData"); { for (int i = 0; i < rows.Length; i++) { if (rows[i] != null) { TaskArgs arguments = new TaskArgs() { Line = i, Row = rows[i], Sync = sync }; Task.Factory.StartNew(func, arguments); } } Task.WaitAll(); } xml.WriteEndElement(); }
wobei der folgende Code einwandfrei funktioniert:
bool inuse = false; public void Serialize(XmlWriter xml, object args) { Action<object> func = delegate(object arguments) { byte[] buffer = new byte[1024 * 10]; MemoryStream ms = new MemoryStream(buffer); string output; TaskArgs taskargs = (TaskArgs)arguments; using (XmlTextWriter xw = new XmlTextWriter(ms, Encoding.Default)) { taskargs.Row.Serialize(xw, taskargs.Line, (SharedStrings)args); xw.Flush(); output = Encoding.Default.GetString(buffer, 0, (int)ms.Position); } while (!inuse) Thread.Sleep(1); inuse = true; xml.WriteRaw(output); inuse = false; }; xml.WriteStartElement("sheetData"); { for (int i = 0; i < rows.Length; i++) { if (rows[i] != null) { TaskArgs arguments = new TaskArgs() { Line = i, Row = rows[i], Sync = sync }; Task.Factory.StartNew(func, arguments); } } Task.WaitAll(); } xml.WriteEndElement(); }
Ich habe absolut keine Ahnung, woran es liegen könnte.
Vielleicht habt ihr ja ne Idee!
Vielen Dank!
-
Solange du uns nicht sagst, auf was für einen Fehler du stösst, können wir dir auch nicht mehr sagen, als dass du auf einen Fehler stösst.
Wieso gibst du uns nicht mehr Informationen zu diesem Fehler? Ist er so geheim? Ist der Fehler von der CIA und darf nicht veröffentlicht werden?
Grüssli
-
"The Writer is closed or in error state."
Tut mir sry.
es scheint, als würde Task.WaitAll() übersprungen werden...
-
*Holt die Nasenzange und fummelt in registalex Nase rum*
Wo tritt der Fehler auf?
Von welchem Typ ist die Exception?Und nicht zuletzt:
Task.WaitAll
erwartet die Tasks, auf welche gewartet werden soll.Grüssli
-
boah ich noob^^
mann muss ja die tasks übergeben...
kann geschlossen werden, sry!
-
Achjeh, das ist eine dieser lustigen "params" Funktionen.
Wo er dann hergeht und ein leeres Array übergibt wenn man sie ohne Parameter aufruft. Was bei der speziellen Funktion natürlich so richtig Sinn macht. Wäre vielleicht auch besser sie hätten da ne Möglichkeit geschaffen anzugeben, dass mindestens ein Objekt erwartet wird.