Diskuze: task zalaguje form1

C# .NET .NET (C# a Visual Basic) task zalaguje form1 American English version English version

Avatar
Dog
Člen
Avatar
Dog:

Čaues, musel jsem přeprogramovat svůj software, protože lagoval form1, při (150x zacyklenym) Thread.Sleep(20), tak jsem to přeprogramoval a dal to zacyklení s sleep do druhého vlákno a dělá to stále to stejné, buttony reagují s dvou vteřinovým zpožděním..

Form1:

private void timer1_Tick(object sender, EventArgs e)
{

    analyze_logs ps = new analyze_logs();
    Task task = new Task (ps.psanalyze);

    task.RunSynchronously();
    task.Wait();

    listBox1.Items.Add(analyze_logs.x);

    gto Cards = ps.Cards;

    if (Cards != null)
    {
        try
        {

ve třídě analyze_logs psanalyze:

if (ok == false)
{
    Thread.Sleep(20);
    tiktak++;
}
 
Odpovědět 5. srpna 22:02
Avatar
vesel.fil
Člen
Avatar
vesel.fil:

Protože to voláš synchronně. Místo RunSynchronously použij Run.

https://msdn.microsoft.com/…ks.task.aspx

Editováno 6. srpna 9:00
Nahoru Odpovědět 6. srpna 8:59
I don't necessarily agree with everything I say.
Avatar
Dog
Člen
Avatar
Dog:

funkce psanalyze vyhledává v textu, když už není žádnej text tak se zacyklí a čeká neustále na další text.

Tak při použití tohoto kódu se po načtení všech dat co mám v PC už nedá Form1 ovládat. Předtím reagovala alespoň po 2-3 sekundách. Tak nevím vážně jak to udělat :(

var /*( i task)*/ t = Task.Run(() => { ps.psanalyze(); });
    t.Wait();
Editováno 6. srpna 11:41
 
Nahoru Odpovědět 6. srpna 11:40
Avatar
Odpovídá na Dog
sadlomaslox25:
private async void timer1_Tick(object sender, EventArgs e)
await Task.Run(() => { ps.psanalyze(); });

precti si nejaky tutorial o vlaknech

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět  +1 6. srpna 15:02
Avatar
Dog
Člen
Avatar
Dog:

no, funguje to, ale problém je právě v tom, že to nečeká, až doběhne ps.psanalyze(); Projel jsem si všechny články v threadingu a zitra budu muset ještě všechny premiovy v objektech, protože mi spousta věcí momentálně nedává smysl.

Takže bych potřeboval, aby to čekalo na dokončení ps.psanalyze();,,a­le ano form se už nezasekne :)

Editováno 6. srpna 20:08
 
Nahoru Odpovědět 6. srpna 20:07
Avatar
VitekST
Člen
Avatar
Odpovídá na Dog
VitekST:

Udělej si callback, který se zavolá až to úloha hotová.

Protože v ten moment, jakmile budeš z hlavního vlákna čekat na vlákno, kde probíhá úloha, zablokuješ si message loop a hlavní formulář ti nebude reagovat.

To stejné se stalo i v prvním případě, kdy si úlohu spouštěl v hlavním vlákně.

 
Nahoru Odpovědět 7. srpna 9:05
Avatar
Dog
Člen
Avatar
Dog:

Mohl by si to prosím trošku přiblížit? :) Díky moc...

 
Nahoru Odpovědět 8. srpna 1:36
Avatar
VitekST
Člen
Avatar
Odpovídá na Dog
VitekST:

Použij prosím pro příště tlačítko "Odpovědět", nikdo totiž nemůže vědět, že na komentář někdo odpovídá.

No, callback, zpětné zavolání.
Ty nemůžeš čekat na dokončení činnosti v jiném vlákně, co ale můžeš udělat, je že vlákno (jakmile se vše dokončí) spustí kód, kterým se ve formuláři pokračuje dále (callback).

Příklad:

void StartAction(){ //Spustí asynchronní úlohu (v novém vlákně)
        Thread t = new Thread(new ThreadStart( () => { //Lambda výraz, předáme do konstruktoru třídy ThreadStart novou anonymní metodu

                DoSomething(); //Nějaká činnost, co trvá stráááášně dlouho
                StartAction_callback(); //Voláme callback, jakmile je vše hotovo
        }));
}

void StartAction_callback(){ //Callback
        this.Invoke(new Action( () => { //DŮLEŽITÉ: Nemůžeš s prvky manipulovat z jiného vlákna; musíš kód spustit v rámci vlákna, kde se nachází formulář (this = Form)

                lbl_Status.Text = "Hotovo"; //Tady si již dělej co chceš
        }));
}
Editováno 8. srpna 13:33
 
Nahoru Odpovědět  +2 8. srpna 13:32
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.