Soru WinForms performansını artırmak için async'i nasıl kullanabilirim?


İşlemcinin ağır bir görevini yapıyordum ve bu komutu çalıştırmaya başladığım her defasında, bordro formum donuyor. Microsoft'un aynı prosedürünü kullandım ama hiçbir şey değişmiş gibi görünmüyor.

çalışma ortamım .net 4.5 ile görsel stüdyo 2012.

private async void button2_Click(object sender, EventArgs e)
{
    Task<string> task = OCRengine();          
    rtTextArea.Text = await task;
}

private async Task<string> OCRengine()
{
    using (TesseractEngine tess = new TesseractEngine(
           "tessdata", "dic", EngineMode.TesseractOnly))
    {
        Page p = tess.Process(Pix.LoadFromFile(files[0]));
        return p.GetText();
    }
}

25
2018-02-19 16:51


Menşei


Beklemenin ne olduğunu henüz bilmiyormuşsunuz gibi görünüyor. Bazı temel tanıtımları okumanı tavsiye ederim. Beklemek örneğin iş parçacığı programlamaz. - usr


Cevaplar:


Evet, hala tüm işi yapıyorsun kullanıcı arabiriminde. kullanma async işi farklı konulara otomatik olarak boşaltmayacak. Bunu yapabildin:

private async void button2_Click(object sender, EventArgs e)
{
    string file = files[0];
    Task<string> task = Task.Run(() => ProcessFile(file));       
    rtTextArea.Text = await task;
}

private string ProcessFile(string file)
{
    using (TesseractEngine tess = new TesseractEngine("tessdata", "dic", 
                                                      EngineMode.TesseractOnly))
    {
        Page p = tess.Process(Pix.LoadFromFile(file));
        return p.GetText();
    }
}

Kullanımı Task.Run demek istedim ProcessFile (ağır iş parçası) farklı bir iş parçacığı üzerinde yürütülür.


51
2018-02-19 16:56



+1. Benzer numunenin ayrıntılı açıklaması ile bir bağlantı daha - visualstudiomagazine.com/articles/2012/08/01/... - Alexei Levenkov
bu çizgi olmamalı Task<string> task = Task.Run(() => ProcessFile(file)); böyle ol: Task<string> task = Task.Run(() => return ProcessFile(file));? - Prokurors
@Prokurors: Hayır. İfade gövdeli lambda ifadelerinin dönüş ifadeleri yoktur. - Jon Skeet
Tamam teşekkürler! Ama bu konuda ne dersiniz? Task<string> task = Task.Run(() => {return ProcessFile(file);});? Derleyici bu şekilde de kabul eder, ancak bu ikisi arasındaki fark nedir? - Prokurors
@Prokurors: Temelde bu durumda bir fark yok. Aynı sonuca sahip hem lambda ifadeleridir. Bir deyim gövdeli lambayı bir ifade ağacına dönüştürebilirsiniz, hepsi bu - bu durumda ilgisiz. - Jon Skeet


Görevinizi yeni iş parçacığına başlatarak da yapabilirsiniz. Sadece Thread.Start veya Thread kullanın. ParameterizedThreadStart

Referans için bunları bakın:

http://msdn.microsoft.com/en-us/library/system.threading.parameterizedthreadstart.aspx 

İpliği parametrelerle başlat 


2
2018-02-19 23:21



Görevler bunu yapmanın daha yeni yoludur. Bunlar, Threads'tan çok daha esnek ve sezgiseldir. - Dasith Wijes