C# 行动<;任务>;实施

C# 行动<;任务>;实施,c#,task,C#,Task,我需要为任务创建两个方法,每个方法都类似于ContinueWith(),但将在主UI线程中执行contunuation 带参数的重载方法操作,操作 方法返回任务(对于带有操作的重载)。返回的任务必须在主任务和继续之后才能完成 全部完成 它是否具有正确的执行功能和操作?如何使用操作输入实现第二种情况返回的任务必须在主任务和继续后才能完成 我实施 namespace WpfApplication2 { /// <summary> /// Interaction logic for Mai

我需要为任务创建两个方法,每个方法都类似于ContinueWith(),但将在主UI线程中执行contunuation

带参数的重载方法<代码>操作,
操作

方法返回任务(对于带有操作的重载)。返回的任务必须在主任务和继续之后才能完成 全部完成

它是否具有正确的执行功能和
操作
?如何使用
操作输入实现第二种情况
返回的任务必须在主任务和继续后才能完成

我实施

namespace WpfApplication2
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        TaskScheduler uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
        WorkAsync WA = new WorkAsync();
        Action firstaction = new Action(WA.Count);
        WA.Work(firstaction, uiScheduler);

        Action<Task> secondaction = new Action<Task>(); //What should be here?
        WA.Work(secondaction, uiScheduler);
    }
    public class WorkAsync
    {
        public Task Work(Action input, TaskScheduler uiSchedule)
        {
            return Task.Factory.StartNew(input).ContinueWith((e) => { Console.WriteLine("Done"); }, uiSchedule);
        }
        public Task Work(Action<Task> input, TaskScheduler uiSchedule)
        {
            /// What should be here?
        }

        public void Count()
        {
            for (int i = 0; i < 10; i++)
            {
                System.Threading.Thread.Sleep(1000);
                Console.WriteLine(i);
            }
        }
    }
}
命名空间WpfApplication2
{
/// 
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
}
私有无效按钮\u单击(对象发送者,路由目标e)
{
TaskScheduler uiScheduler=TaskScheduler.FromCurrentSynchronizationContext();
WorkAsync WA=新的WorkAsync();
Action firstaction=新操作(WA.Count);
WA.工作(第一个行动,uiScheduler);
Action secondaction=new Action();//这里应该是什么?
WA.工作(第二行动,uiScheduler);
}
公共类WorkAsync
{
公共任务工作(操作输入、任务调度器和日程安排)
{
返回Task.Factory.StartNew(input).ContinueWith((e)=>{Console.WriteLine(“Done”);},uiSchedule);
}
公共任务工作(操作输入、任务调度器和日程安排)
{
///这里应该有什么?
}
公众作废计数()
{
对于(int i=0;i<10;i++)
{
系统线程线程睡眠(1000);
控制台写入线(i);
}
}
}
}

}

您的要求听起来不对

Action
的异步对应项不是
Action
——而是
Func
。框架中有许多方法支持我的上述语句,
Task.Run

同样,对于
Action
而言,异步版本为
Func
。对于
操作
它是
Func
。你明白了

因此,考虑到这一点,您的实施现在变成:

public Task Work(Func<Task> input, TaskScheduler uiScheduler)
{
    return input().ContinueWith(e => Console.WriteLine("Done"), uiScheduler);
}
现在,您甚至可以用
工作(Func,TaskScheduler)
来表示另一种方法:


你的要求听起来不对

Action
的异步对应项不是
Action
——而是
Func
。框架中有许多方法支持我的上述语句,
Task.Run

同样,对于
Action
而言,异步版本为
Func
。对于
操作
它是
Func
。你明白了

因此,考虑到这一点,您的实施现在变成:

public Task Work(Func<Task> input, TaskScheduler uiScheduler)
{
    return input().ContinueWith(e => Console.WriteLine("Done"), uiScheduler);
}
现在,您甚至可以用
工作(Func,TaskScheduler)
来表示另一种方法:


看起来基本的等待应该足够了。。。为什么需要如此复杂的代码?我想第二种方法的签名是错误的-
公共任务工作(操作输入,TaskScheduler uiSchedule)
-在我看来,它应该是
公共任务工作(任务当前,操作输入,TaskScheduler uiSchedule)
。否则,您似乎正在执行某种不可能的递归任务。@AlexeiLevenkov,这是一项用操作实现的任务。
我需要为任务创建两个方法,每个方法类似于ContinueWith(),但将在主UI线程中执行contunation。
这听起来像是一个非常有问题的设计。你想解决的实际问题是什么?@StephenCleary,这是测试任务的文本。我不知道为什么和什么。他们要我做。看起来基本的
等待
就足够了。。。为什么需要如此复杂的代码?我想第二种方法的签名是错误的-
公共任务工作(操作输入,TaskScheduler uiSchedule)
-在我看来,它应该是
公共任务工作(任务当前,操作输入,TaskScheduler uiSchedule)
。否则,您似乎正在执行某种不可能的递归任务。@AlexeiLevenkov,这是一项用操作实现的任务。
我需要为任务创建两个方法,每个方法类似于ContinueWith(),但将在主UI线程中执行contunation。
这听起来像是一个非常有问题的设计。你想解决的实际问题是什么?@StephenCleary,这是测试任务的文本。我不知道为什么和什么。他们要我做。
public Task Work(Action input, TaskScheduler uiScheduler)
{
    return Work(() => Task.Run(input), uiScheduler);
}