kdb*_*man 9 c# continuations multithreading winforms
C#noob来自其他语言的经验.(最值得注意的是Java).
我正在看这个问题的代码.这是VS 2013中的标准WinForms C#项目:
在表单上放一个按钮和一个文本框,然后使用以下代码:
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;
}
Run Code Online (Sandbox Code Playgroud)
按下按钮,等待2秒钟DelayedAdd以完成四个呼叫,并在文本框中显示结果(115). 每次DelayedAdd通话后如何才能在结果文本框中显示结果?
我试图推动每次通话之间的最后延续,
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());
Run Code Online (Sandbox Code Playgroud)
但是失败了,我猜是因为我插入的延续不会返回整数结果t.我是一个C#noob,我甚至不知道如何解决这个问题,更不用说以惯用的方式做到这一点.
我只是改变DelayedAdd方法:
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;
}
Run Code Online (Sandbox Code Playgroud)
知道了!如果有人有更好/更有趣的选择,请回答。
首先,我尝试使用多行 lambda 来代替我的问题中的错误延续:
.ContinueWith(t => {
textBox1.Text = t.Result.ToString();
return t.Result;
},
TaskScheduler.FromCurrentSynchronizationContext());
}
Run Code Online (Sandbox Code Playgroud)
这有点冗长和重复,所以我把它干掉了:
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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1105 次 |
| 最近记录: |