这个班级CancellationTokenSource是一次性的.快速浏览Reflector证明KernelEvent了(很可能)非托管资源的使用.由于CancellationTokenSource没有终结器,如果我们不处理它,GC将不会这样做.
另一方面,如果您查看MSDN文章" 托管线程中的取消"中列出的示例,则只有一个代码段处置该令牌.
在代码中处理它的正确方法是什么?
using如果您不等待它,则无法将启动并行任务的代码包装起来.只有在你不等的时候取消才有意义.ContinueWith通过Dispose电话添加任务,但这是要走的路吗?.ForAll(x => Console.Write(x))?因为它没有类似于Reset清理IsCancelRequested和Token字段的方法,所以我认为它不可重复使用,因此每次启动任务(或PLINQ查询)时都应该创建一个新任务.这是真的吗?如果是,我的问题是Dispose在这些CancellationTokenSource案例中处理的正确和建议的策略是什么?
我刚看到3个关于TPL使用的例程,它们执行相同的工作; 这是代码:
public static void Main()
{
Thread.CurrentThread.Name = "Main";
// Create a task and supply a user delegate by using a lambda expression.
Task taskA = new Task( () => Console.WriteLine("Hello from taskA."));
// Start the task.
taskA.Start();
// Output a message from the calling thread.
Console.WriteLine("Hello from thread '{0}'.",
Thread.CurrentThread.Name);
taskA.Wait();
}
public static void Main()
{
Thread.CurrentThread.Name = "Main";
// Define and run the task.
Task taskA = Task.Run( () => Console.WriteLine("Hello from taskA."));
// Output a …Run Code Online (Sandbox Code Playgroud) 有没有人知道做Task.Factory.StartNewvs new Task后跟调用Start任务之间是否有任何区别.看反射器似乎没有太大的区别.所以也许唯一的区别是Task.Factory.StartNew返回已经启动的任务.它是否正确?
我知道Task.Factory.StartNew并且Task.Run有不同的默认选项,Task.Run是.Net 4.5的首选选项.
此代码抛出异常.是否可以定义将捕获它的应用程序全局处理程序?
string x = await DoSomethingAsync();
Run Code Online (Sandbox Code Playgroud)
使用.net 4.5/WPF
是否有建议的自我取消和重启任务模式?
例如,我正在研究背景拼写检查程序的API.拼写检查会话被包装为Task.每个新会话都应该取消之前的会话并等待其终止(以正确地重新使用拼写检查服务提供商等资源).
我想出了这样的事情:
class Spellchecker
{
Task pendingTask = null; // pending session
CancellationTokenSource cts = null; // CTS for pending session
// SpellcheckAsync is called by the client app
public async Task<bool> SpellcheckAsync(CancellationToken token)
{
// SpellcheckAsync can be re-entered
var previousCts = this.cts;
var newCts = CancellationTokenSource.CreateLinkedTokenSource(token);
this.cts = newCts;
if (IsPendingSession())
{
// cancel the previous session and wait for its termination
if (!previousCts.IsCancellationRequested)
previousCts.Cancel();
// this is not expected to throw
// as the …Run Code Online (Sandbox Code Playgroud) 我正在使用 C#、TPL。我有一个类包含一些执行一些子任务的异步方法,为简单起见,我将只考虑一种方法和一个子任务:
class Test1
{
private Task SubTask() => Task.Delay(1000);
public async Task FullTask()
{
Console.WriteLine("Task Start");
await SubTask();
Console.WriteLine("Task Middle");
await SubTask();
Console.WriteLine("Task End");
}
static async Task Main()
{
Test1 Test = new Test1();
Task Task1 = Test.FullTask();
Task Task2 = Test.FullTask();
await Task.WhenAll(Task1, Task2);
}
}
Run Code Online (Sandbox Code Playgroud)
执行后,控制台中会打印以下(预期的)结果:
Task Start
Task Start
Task Middle
Task Middle
Task End
Task End
Run Code Online (Sandbox Code Playgroud)
问题是每次调用都FullTask必须在前一个调用完成后运行,如果多个调用FullTask同时发生,则必须逐个处理。我的第一个想法是使用该ContinueWith方法:
class Test2
{
private Task LastTask = Task.CompletedTask;
private Task SubTask() …Run Code Online (Sandbox Code Playgroud)