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。它将从添加延续时处于活动状态的上下文运行延续。如果从主线程添加延续(即使它正在运行的任务不在主线程中),则可以,但如果确实从后台线程/上下文附加延续,则它将在该后台上下文中运行。您尝试过什么吗?请阅读,你的情况真的不清楚-你没有告诉我们你是如何使用它的,或者你是如何诊断问题的。现在我的情况很清楚了?你试过什么吗?请阅读,您的情况真的不清楚-您没有告诉我们您是如何使用它的,或者您是如何诊断问题的。现在我的情况很清楚了?谢谢您的回答。你真的帮了我。谢谢你的回答。你真的帮了我。