Autor Beitrag
Telefisch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Mi 03.06.09 11:21 
Hallo Forum,
ich hoffe ich bin hier richtig.
Mein Problem stellt sich folgendermaßen dar:

Ich muss teilweise sehr zeitintensive Operationen mit einer externen Assembly ausführen.
Normalerweise würde man Diese in einen eigenen Thread auslagern aaaber.
Das Objekt, was mit dieser Assembly erzeugt wird, darf nur einmal initialisiert werden.
Daraus folgt, dass es nur einmal bei Programmstart erzeugt wird und als Globales Objekt im Programm zur Verfügung steht.
Jetzt kann ich natürlich nicht in einem anderen Thread auf dieses Objekt zugreifen da ich sonst einen Fehler wegen unerlaubtem Aufruf aus anderem Thread bekomme.
Also wäre mein Lösungsansatz das Objekt schon beim ersten mal in einem eigenen Thread zu erzeugen und dann... hmm... da hakt es.

Also meine Fragen, sofern mein Lösungsansatz richtig ist:
Wie erzeuge ich ein Objekt in einem anderen Thread, ohne das der Thread gleich wieder stirbt.
Und wie greife ich dann auf die Methoden in diesem anderen Thread zu?

Irgendwie hab ich mittlerweile einen Knoten im Gehirn.

Kann mir da jemand vielleicht eine step by step-Hilfe geben?

Danke Tele
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mi 03.06.09 13:24 
"Dem ursprünglichen Entwickler das Objekt an den Kopf werfen" ist keine gültige Lösung, oder :P ?
Dann bräuchtest du wohl ein kleines Messaging-System, quasi einen ein-threadigen Thread-Pool (ahja *g*). Gesehen habe ich sowas noch nie, also null Garantie ;) .

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace ConsoleApplication1
{
  class Program
  {
    static void Main(string[] args)
    {
      Console.WriteLine("Mainthread: " + Thread.CurrentThread.ManagedThreadId);
      GlobalThingy g = new GlobalThingy();
      var m = new Mailbox();
      m.Post(() => g.Initialize());
      m.Post(() => g.Run());
      Console.WriteLine("Im Mainthread gehts weiter...");
    }
  }

  class GlobalThingy
  {
    public void Initialize()
    {
      Console.WriteLine("Initialisiert auf: " + Thread.CurrentThread.ManagedThreadId);
    }

    public void Run()
    {
      Console.WriteLine("Run() auf: " + Thread.CurrentThread.ManagedThreadId);
      Thread.Sleep(4000);
    }
  }

  sealed class Mailbox
  {
    // Einen ThreadPool-Thread sollte man für eine so lange Aktion nicht opfern
    Thread thread;
    // True, wenn die Queue nicht leer ist
    ManualResetEvent mre = new ManualResetEvent(false);
    Queue<Action> queue = new Queue<Action>();

    void Run()
    {
      for (; ; ) { // ggf. noch einen Cancellation-Mechanismus einfügen
        // Auf neue Aufträge warten
        mre.WaitOne();

        // Abarbeiten
        Action item;
        lock (queue) {
          if (queue.Count == 0) {
            mre.Reset();
            continue;
          }

          item = queue.Dequeue();
        }
        item();
      }
    }

    public void Post(Action item)
    {
      if (thread == null) {
        thread = new Thread(Run); // { IsBackground = true };
        thread.Start();
      }

      lock (queue)
        queue.Enqueue(item);

      mre.Set();
    }
  }
}


Brr, Multithreading :| . Ich hoffe, ich habe nicht allzu großen Blödsinn gebaut ;) .

_________________
>λ=
Telefisch Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Mi 03.06.09 13:38 
Hallo Kha...
vorweg, danke für die schnelle Antwort.

Also wenn ich das richtig sehe erzeugt die Klasse ihren eigenen Thread.
Ich glaube ich verstehe das. (Zumindest Hoffe ich das :D )

Im Augenblick muss ich mich erst mit den Sicherheitsrichtlinien vom Framework rumschlagen, dann kann ich mich wieder diesem Thema widmen.
Ich werde das dann mal ausprobieren und entsprechend berichten.

Nochmals Danke
Tele