русский
Germany.ruForen → Архив Досок→ Programmierung

​Немножко вне рутины...

25.05.17 13:30
Re: ​Немножко вне рутины...
 
Murr патриот
Murr
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 thread
b2.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 в пулл по окончании работы.

 

Sprung zu