使用Winforms和C#在继续时更新文本框

本文关键字:更新 文本 继续 Winforms 使用 | 更新日期: 2023-09-27 17:59:50

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;
}

按下按钮,等待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());

但是失败了,我猜是因为我插入的continuation没有返回整数结果t。我是一个C#noob,我甚至不知道如何修复,更不用说用惯用的方法了。

使用Winforms和C#在继续时更新文本框

我只想更改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;
    }

明白了!如果有人有更好/更有趣的选择,请回答。

首先,我尝试了一个多行lambda来代替问题中的错误延续

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

这有点冗长和重复,所以我把它整理了一下:

    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;
    }