Threads og Monitor.
Hejsa.Så er turen kommet til tråde, kan dog ikke lige få det til at lykkes. Mangler nok en del grundlæggende forståelse
af tråde, så dette er måske helt hen i skoven :)
skal lave en app der kan lave 2000 operationer...Dog kan der kun håndteres 10 adgangen.
Hver operation tager mellem 15 og 180 sek.
Min ide er så at lave dette med tråde, og starte alle 2000 jobs og så have dem i en threadpool.
Ved dog ikke om dette er grebet rigtigt an.
Her kommer lige lidt kode som jeg har skrevet for at lære tråde at kende og som prøver at simulere min opgave(tror jeg;).
//form..her starter jeg 1000 tråde.
namespace threadTest
{
public partial class Form1 : Form
{
private int threadNr;
public Form1()
{
InitializeComponent();
threadNr = 1;
}
private void button1_Click(object sender, EventArgs e)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(StartJob));
}
public void StartJob(Object stateInfo)
{
for (int j = 1; j <= 100; j++)
{
for (int i = 1; i <= 10; i++)
{
task t = new task(count);
threadNr++;
Thread th = new Thread(new ThreadStart(t.test));
th.Start();
}
}
}
}
}
------------------------
task. en klasse der simulere en opgave.
namespace threadTest
{
class task
{
private int loops;
private Random r = new Random();
private int thNr;
myFileWriter myFw = new myFileWriter();
public task(int id)
{
this.thNr = id;
}
public void test()
{
loops = r.Next(200000, 1000000);
//logKald
callWriter("Tråd nr->" + thNr + " start->" +
DateTime.Now + "-" + DateTime.Now.Millisecond + "\r\n");
///--> random tidsforbrug på opgaven
//for (int i = 0; i < loops; i++)
//{
// for (int j = 0; j < 300; j++)
// {
// }
//}
//logKald
callWriter("Tråd nr->" + thNr + " slut-->" +
DateTime.Now + "-" + DateTime.Now.Millisecond + " antal loops->" + (loops+500) + " slut->" + "\r\n");
}
private void callWriter(string msg)
{
Monitor.Enter(myFw);
try
{
Monitor.Pulse(myFw);
myFw.writeToFile(msg);
}
finally
{
Monitor.Exit(myFw);
myFw = null;
}
}
}
}
-----------------------------------
myFilewriter. Skriver log-data til fil.
namespace threadTest
{
class myFileWriter
{
public void writeToFile(string msg)
{
FileStream fs = new FileStream("C:/udvikling/Test/thread/log.txt", FileMode.Append
, FileAccess.Write);
StreamWriter sw = new StreamWriter(fs);
sw.Write(msg);
sw.Close();
}
}
}
----------------------------------------------
Og hvad er så lige mit problem.
Det hele kørte fint, sålænge jeg kun havde en lykke omkring StartJob() i buttonClick
og ikke hvade udkommenteret dobbelt lykken i task klassen.
Men for at presse det hele lidt, udkommenterede jeg dobbelt lykken og sattet et ekstra loop om StartJob(), så
der virkelig ville komme gang i garnforretningen....og det gjorde der så.
når jeg køre det, får jeg en fejl i myFileWriter, der siger at der ikke er tilgang til filen, da den er i brug
af en anden process..
Og det burde vel også være rigtigt, hvis ikke det lige var for monitor..Burde den ikke styre det?.
Ved heller ikke om jeg bruger TreadPool rigtigt, eller om jeg bare er i nærheden af at gribe denne problem stiling
rigtigt an. Er det rigtigt at bruge monitor?
Håber nogen har lidt tid og kan oversku mit problem.....og selvfølgelig hjælpe lidt:)
