Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何编写在标准延续工作完成后将执行的当前线程任务延续?_C#_.net_Multithreading_Task Parallel Library - Fatal编程技术网

C# 如何编写在标准延续工作完成后将执行的当前线程任务延续?

C# 如何编写在标准延续工作完成后将执行的当前线程任务延续?,c#,.net,multithreading,task-parallel-library,C#,.net,Multithreading,Task Parallel Library,我需要编写扩展方法,它的工作方式类似于Task.ContinueWith(),但在主线程上以及Task.ContinueWith()结束之后 public static Task ContinueWithOnMainThread(this Task task, Action action) { return task.ContinueWith(t => action(), TaskScheduler.FromCurrentSynchronizationContext()); }

我需要编写扩展方法,它的工作方式类似于
Task.ContinueWith()
,但在主线程上以及
Task.ContinueWith()结束之后

public static Task ContinueWithOnMainThread(this Task task, Action action) {
    return task.ContinueWith(t => action(), TaskScheduler.FromCurrentSynchronizationContext());
}
此方法有效,但它在Task.ContinueWith()之前执行

我就是这样测试的:

public partial class MainWindow : Window {
    public MainWindow() {
        InitializeComponent();
        Loaded += delegate {
            LogThread("\nInMain ThredId: " + Thread.CurrentThread.ManagedThreadId);
            var task = new Task(InTask);
            task.ContinueWith(TaskContinue);
            task.ContinueWithOnMainThread(ReturnedToMainThread);
            task.Start();
        };
    }

    void InTask() {
        this.Dispatcher.Invoke(DispatcherPriority.DataBind, (Action<string>)LogThread, "\nInTask ThredId: " + Thread.CurrentThread.ManagedThreadId);
    }

    void TaskContinue(Task task) {
        this.Dispatcher.Invoke(DispatcherPriority.DataBind, (Action<string>)LogThread, "\nTaskContinue ThredId: " + Thread.CurrentThread.ManagedThreadId);
    }

    void ReturnedToMainThread() {
        LogThread("\nReturnedToMainThread ThredId: " + Thread.CurrentThread.ManagedThreadId);
    }

    void LogThread(string text) {
        TB.Text += text;
    }
}
公共部分类主窗口:窗口{
公共主窗口(){
初始化组件();
已加载+=委托{
LogThread(“\nInMain ThredId:+Thread.CurrentThread.ManagedThreadId”);
var任务=新任务(InTask);
task.ContinueWith(TaskContinue);
task.ContinueWithOnMainThread(返回到ToMainThread);
task.Start();
};
}
虚报{
this.Dispatcher.Invoke(DispatcherPriority.DataBind,(Action)LogThread,“\nTask ThredId:”+Thread.CurrentThread.ManagedThreadId);
}
作废任务继续(任务){
this.Dispatcher.Invoke(DispatcherPriority.DataBind,(Action)LogThread,“\nTaskContinue ThredId:”+Thread.CurrentThread.ManagedThreadId);
}
void ReturnedToMainThread(){
LogThread(“\nReturnedToMainThread ThredId:+Thread.CurrentThread.ManagedThreadId”);
}
无效日志线程(字符串文本){
TB.Text+=文本;
}
}

问题就在这里:

var task = new Task(InTask);
task.ContinueWith(TaskContinue);
task.ContinueWithOnMainThread(ReturnedToMainThread);
您正在向同一
任务添加两个continuations
。如果希望
ReturnedToMainThread
TaskContinue
之后运行,则需要将运行
TaskContinue
的continuation作为传递给
ContinueWithOnMainThread
的对象。您可以这样做:

var task = new Task(InTask);
task.ContinueWith(TaskContinue)
.ContinueWithOnMainThread(ReturnedToMainThread);

还值得注意的是,
ContinueWithOnMainThread
并不总是在主线程上运行continueWithon。它将从添加延续时处于活动状态的上下文运行延续。如果您从主线程添加延续(即使它正在运行的任务不在主线程中),那么您没有问题,但是如果您确实从后台线程/上下文附加延续,那么它将在该后台上下文中运行。

因此问题就在这里:

var task = new Task(InTask);
task.ContinueWith(TaskContinue);
task.ContinueWithOnMainThread(ReturnedToMainThread);
您正在向同一
任务添加两个continuations
。如果希望
ReturnedToMainThread
TaskContinue
之后运行,则需要将运行
TaskContinue
的continuation作为传递给
ContinueWithOnMainThread
的对象。您可以这样做:

var task = new Task(InTask);
task.ContinueWith(TaskContinue)
.ContinueWithOnMainThread(ReturnedToMainThread);

还值得注意的是,
ContinueWithOnMainThread
并不总是在主线程上运行continueWithon。它将从添加延续时处于活动状态的上下文运行延续。如果从主线程添加延续(即使它正在运行的任务不在主线程中),则可以,但如果确实从后台线程/上下文附加延续,则它将在该后台上下文中运行。

您尝试过什么吗?请阅读,你的情况真的不清楚-你没有告诉我们你是如何使用它的,或者你是如何诊断问题的。现在我的情况很清楚了?你试过什么吗?请阅读,您的情况真的不清楚-您没有告诉我们您是如何使用它的,或者您是如何诊断问题的。现在我的情况很清楚了?谢谢您的回答。你真的帮了我。谢谢你的回答。你真的帮了我。