Login
Немножко вне рутины...
701 просмотров
Перейти к просмотру всей ветки
in Antwort Murr 22.05.17 11:25
Погонял в многопоточном режиме - все работает... На удивление - работает и работает нормально.
Видимо мелкомягкие сумели где-то спереть приличную реализацию потоков...
Вроде - уже постил, но что-то не вижу... видимо германка глючит...
using System;using System.IO;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;namespace ThreadStaticTest3{interface IB{void GetResult();}class A : IB{[ThreadStatic]static StreamWriter sw = null;public StreamWriter Sw{get{if (sw == null){// get from class where instantiated/specified.throw new Exception("Output stream is null or not specified.");}return sw;}set { sw = value; }}public virtual void GetResult() { }}class B1 : A{String b1 = "B1";public override void GetResult(){Thread.Sleep(300);Sw.WriteLine(b1 + " 1");Thread.Sleep(300);IB b2 = Program.Factory.Create("B2"); // from different threadb2.GetResult();Thread.Sleep(300);Sw.WriteLine(b1 + " 2");Thread.Sleep(300);}}class B2 : A{String b2 = "B2";public override void GetResult(){Sw.WriteLine(b2);}}class Process{static int threads = 0;static object loker = new object();int thread;public Process(){lock (loker){++threads;thread = threads;}}public void Execute(){Thread newThread = new Thread(new ThreadStart(this.Generate));newThread.Name = threads.ToString();newThread.Start();}private void Generate(){using (StreamWriter sw = new StreamWriter("Data_" + thread.ToString() + ".dat")){B1 b1 = new B1();b1.Sw = sw;b1.GetResult();}}}class Factory{public IB Create(string pName){IB temp = null;switch(pName){case "B1":temp = new B1();break;case "B2":temp = new B2();break;default:throw new Exception("Factory can't create item - " + pName);}return temp;}}class Program{static void Main(string[] args){Thread.CurrentThread.Name = "Main";Factory = new Factory();for (int i = 0; i < 20; ++i){Process p = new Process();p.Execute();}}//private static Factory factory;//public static Factory Factory { get { return factory; } }public static Factory Factory { get; private set; }}}
Тут вроде все понятно.
Теперь об трудностях.
Есть такая радость - БэкгроундВоркер.
Пользовал Я его уже достаточно много, но пока не требовалось получать доступ к полям объекта после выполнения работы.
Кто-нибудь делал? Мне нужно вернуть стреам из Б1 в пулл по окончании работы.