是否有一种"标准"方式来指定任务延续应该在创建初始任务的线程上运行?
目前我有下面的代码 - 它正在工作,但跟踪调度程序和创建第二个动作似乎是不必要的开销.
dispatcher = Dispatcher.CurrentDispatcher;
Task task = Task.Factory.StartNew(() =>
{
DoLongRunningWork();
});
Task UITask= task.ContinueWith(() =>
{
dispatcher.Invoke(new Action(() =>
{
this.TextBlock1.Text = "Complete";
}
});
Run Code Online (Sandbox Code Playgroud) 我有一个WPF GUI,我想按下一个按钮来启动一个长任务,而不会在任务期间冻结窗口.当任务正在运行时,我想获得有关进度的报告,我想在我选择的任何时候添加另一个按钮来停止任务.
我无法想出使用async/await/task的正确方法.我不能包括我尝试的所有东西,但这就是我现在拥有的东西.
一个WPF窗口类:
public partial class MainWindow : Window
{
readonly otherClass _burnBabyBurn = new OtherClass();
internal bool StopWorking = false;
//A button method to start the long running method
private async void Button_Click_3(object sender, RoutedEventArgs e)
{
Task burnTheBaby = _burnBabyBurn.ExecuteLongProcedureAsync(this, intParam1, intParam2, intParam3);
await burnTheBaby;
}
//A button Method to interrupt and stop the long running method
private void StopButton_Click(object sender, RoutedEventArgs e)
{
StopWorking = true;
}
//A method to allow the worker method to call …Run Code Online (Sandbox Code Playgroud) 试图使用新的C#5异步模型,令我惊讶的AspNetSynchronizationContext是内部类(以及AspNetSynchronizationContextBase基础).因而无证.但是,在ASP.NET代码中使用async/await功能时,了解它的作用至关重要.我是否正确,它确实保证您的延续将与HttpContext.Current原始呼叫者相同?它不保证continuation将在与调用者相同的线程上执行吗?
如果后一个假设不正确并且我得到原始线程,我可以确保在continuation中获得相同的线程上下文吗?我的意思是与线程和线程本地存储相关的主体/文化?这很重要,因为ASP.NET本地化依赖于线程的文化,而我的应用程序依赖于.NET角色安全模型(线程的主体).
我在Excel工作表上有一个按钮,它启动一个新线程来进行一些处理.如果我想对Excel进行任何更改(例如,将数据写入单元格Worksheet.Range("A1").Value = "info";),我想我必须使用主UI线程.
如何才能做到这一点?
通常,在的WinForms我所说Invoke的控制,但Excel.Application或Worksheet或Range对象没有一个Invoke方法.
c# ×3
.net ×2
asynchronous ×2
wpf ×2
asp.net ×1
async-await ×1
c#-5.0 ×1
excel ×1
task ×1
vsto ×1