2015-06-25 22 views
9

C# noob ile güncelleyin. (En önemlisi Java).Metin formunu, diğer dillerdeki deneyimlerden gelen Winforms ve C#

Şu anda this question adlı kullanıcı kodunu görüyorum.

form üzerinde bir düğme ve bir metin kutusu bırakın ve bu kodu kullanın:

private void button1_Click(object sender, EventArgs e) 
{ 
    Task.Factory.StartNew<int>(() => DelayedAdd(5, 10)) 
     .ContinueWith(t => DelayedAdd(t.Result, 20)) 
     .ContinueWith(t => DelayedAdd(t.Result, 30)) 
     .ContinueWith(t => DelayedAdd(t.Result, 50)) 
     .ContinueWith(t => textBox1.Text = t.Result.ToString(), 
      TaskScheduler.FromCurrentSynchronizationContext()); 
} 

private int DelayedAdd(int a, int b) 
{ 
    Thread.Sleep(500); 
    return a + b; 
} 

düğmesine basın, dört DelayedAdd için 2 saniye bekleyin O VS 2013 standart WinForms C# projesi var tamamlamak için çağrılar ve sonuç (115) metin kutusunda görüntülenir. Her DelayedAdd aramasından sonra metin kutusunda görüntülenen sonucu nasıl alabilirim?

Ben, her çağrı arasında

Task.Factory.StartNew<int>(() => DelayedAdd(5, 10)) 
    .ContinueWith(t => textBox1.Text = t.Result.ToString(), 
     TaskScheduler.FromCurrentSynchronizationContext()) 

    .ContinueWith(t => DelayedAdd(t.Result, 20)) 
    .ContinueWith(t => textBox1.Text = t.Result.ToString(), 
     TaskScheduler.FromCurrentSynchronizationContext()) 

    .ContinueWith(t => DelayedAdd(t.Result, 30)) 
    .ContinueWith(t => textBox1.Text = t.Result.ToString(), 
     TaskScheduler.FromCurrentSynchronizationContext()) 

    .ContinueWith(t => DelayedAdd(t.Result, 50)) 
    .ContinueWith(t => textBox1.Text = t.Result.ToString(), 
     TaskScheduler.FromCurrentSynchronizationContext()); 

nihai devamını kıpırdamak çalıştı ama bu eklenen continuations sayı sonucunu t dönmek yok çünkü ben tahmin ediyorum, başarısız olur. Böyle bir C# noob değilim, 'un'u nasıl düzelteceğini bile bilmiyorum, bunu sadece deyimsel bir şekilde yapalım.

+0

Hangi çerçeve sürümünü kullanıyorsunuz? –

+0

Bu Yuval ile aynı soru olabilir, ancak Görev nedir? Ve EventArgs? –

+0

Kutudan çıktı WinForms. Üzgünüm, bundan bahsetmiştim. – kdbanman

cevap

1

Anladım! Daha iyi/daha ilginç alternatifler varsa, lütfen cevap verin.

İlk Sorumun gelen hatalı devamlılık yerine bir satırlı lamda çalıştı: biraz ayrıntılı ve tekrarlayan var

.ContinueWith(t => { 
     textBox1.Text = t.Result.ToString(); 
     return t.Result; 
    }, 
     TaskScheduler.FromCurrentSynchronizationContext()); 
    } 

, bu yüzden o kadar dryed:

private void button1_Click(object sender, EventArgs e) 
    { 
     // SCHEDULING LOGIC 
     Task.Factory.StartNew<int>(() => DelayedAdd(5, 10)) 
      .ContinueWith(t => UpdateText(t.Result), 
       TaskScheduler.FromCurrentSynchronizationContext()) 

      .ContinueWith(t => DelayedAdd(t.Result, 20)) 
      .ContinueWith(t => UpdateText(t.Result), 
       TaskScheduler.FromCurrentSynchronizationContext()) 

      .ContinueWith(t => DelayedAdd(t.Result, 30)) 
      .ContinueWith(t => UpdateText(t.Result), 
       TaskScheduler.FromCurrentSynchronizationContext()) 

      .ContinueWith(t => DelayedAdd(t.Result, 50)) 
      .ContinueWith(t => UpdateText(t.Result), 
       TaskScheduler.FromCurrentSynchronizationContext()); 
    } 

    private int UpdateText(int i) 
    { 
     // UI LOGIC 
     textBox1.Text = i.ToString(); 
     return i; 
    } 

    private int DelayedAdd(int a, int b) 
    { 
     // PROCESS LOGIC 
     Thread.Sleep(500); 
     return a + b; 
    } 
+0

Bu benim cevabım olacaktı! – kidshaw

5

ben istiyorum sadece değiştirin DelayedAdd yöntem:

private void button1_Click(object sender, EventArgs e) 
    { 
     Task.Factory.StartNew<int>(() => DelayedAdd(5, 10)) 
      .ContinueWith(t => DelayedAdd(t.Result, 20)) 
      .ContinueWith(t => DelayedAdd(t.Result, 30)) 
      .ContinueWith(t => DelayedAdd(t.Result, 50)); 
    } 

    private int DelayedAdd(int a, int b) 
    { 
     if (textBox1.InvokeRequired) 
     { 
      textBox1.BeginInvoke((Action)(() => textBox1.Text = (a + b).ToString())); 
     } 
     Thread.Sleep(500); 
     return a + b; 
    } 
+0

İlginç. Neden InvokeRequired' koruyucusu? Bunun ne olduğu hakkında fikrim yok. – kdbanman

+0

UI'nizi farklı iş parçacığından güncellemek istediğinizde, – voytek

+0

gitmenin yolu bu zaten ikinci 'ContinueWith' parametresi olan TaskScheduler.FromCurrentSynchronizationContext()' kapsamında olduğunu düşündüm. – kdbanman