我正在玩这些Windows 8 WinRT任务,我正在尝试使用下面的方法取消任务,并且它在某种程度上起作用.CancelNotification方法被调用,这使您认为任务已被取消,但在后台任务继续运行,然后在完成后,任务的状态始终完成且永不取消.有没有办法在取消任务时完全停止?
private async void TryTask()
{
CancellationTokenSource source = new CancellationTokenSource();
source.Token.Register(CancelNotification);
source.CancelAfter(TimeSpan.FromSeconds(1));
var task = Task<int>.Factory.StartNew(() => slowFunc(1, 2), source.Token);
await task;
if (task.IsCompleted)
{
MessageDialog md = new MessageDialog(task.Result.ToString());
await md.ShowAsync();
}
else
{
MessageDialog md = new MessageDialog("Uncompleted");
await md.ShowAsync();
}
}
private int slowFunc(int a, int b)
{
string someString = string.Empty;
for (int i = 0; i < 200000; i++)
{
someString += "a";
}
return a + b;
}
private void CancelNotification() …Run Code Online (Sandbox Code Playgroud) 我们可以中止这样的线程:
Thread thread = new Thread(SomeMethod);
.
.
.
thread.Abort();
Run Code Online (Sandbox Code Playgroud)
但是我可以以相同的方式中止任务(在.Net 4.0中)而不是取消机制.我想立即杀死任务.
我有一系列代码块花了太长时间.它失败时我不需要任何技巧.事实上,我想在这些块花费太长时间时抛出异常,并且只是通过我们的标准错误处理而失败.我宁愿不为每个块创建方法(这是我到目前为止看到的唯一建议),因为它需要重新编写代码库.
下面是我LIKE如果可能创造.
public void MyMethod( ... )
{
...
using (MyTimeoutObject mto = new MyTimeoutObject(new TimeSpan(0,0,30)))
{
// Everything in here must complete within the timespan
// or mto will throw an exception. When the using block
// disposes of mto, then the timer is disabled and
// disaster is averted.
}
...
}
Run Code Online (Sandbox Code Playgroud)
我使用Timer类创建了一个简单的对象.(注意那些喜欢复制/粘贴的人:这个代码不起作用!!)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Timers;
public class MyTimeoutObject : IDisposable
{
private Timer timer = null;
public MyTimeoutObject …Run Code Online (Sandbox Code Playgroud) 可能重复:
如何中止/取消TPL任务?
我有一个方法需要一些时间来执行因此我返回结果作为回调.我的方法看起来像:
public static void DoWork( Action<object> onCompleteCallBack)
{
Task.Factory.StartNew( () => {
// Do work
onCompleteCallBack(someResult);
});
}
Run Code Online (Sandbox Code Playgroud)
现在我希望能够在用户不想等待的情况下停止执行该方法.结果这就是我的成果:
static void Main ( string[] args )
{
var cancelMethod = DoWork( x =>
{
// method completed
Console.Write( x.ToString() );
});
Thread.Sleep( 5000 ); // some time passes
// then user decides to abort method
cancelMethod();
Console.Read();
}
static Action DoWork ( Action<object> onCompleteCallBack )
{
bool stopExecuting = false;
Task.Factory.StartNew( () =>
{
for ( var i …Run Code Online (Sandbox Code Playgroud) 我创造了一个小包装CancellationToken和CancellationTokenSource.我遇到的问题是CancelAsync方法CancellationHelper不能按预期工作.
我遇到了这个ItShouldThrowAExceptionButStallsInstead方法的问题.要取消正在运行的任务,它会调用await coordinator.CancelAsync();,但该任务实际上没有被取消,并且不会引发异常task.Wait
ItWorksWellAndThrowsException似乎运行良好而且使用coordinator.Cancel,这根本不是异步方法.
当我CancellationTokenSource在异步方法中调用Cancel方法时,为什么没有取消任务的问题是什么?
不要让waitHandle你迷惑,这只是为了不让任务提前完成.
让代码说明一切:
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
namespace TestCancellation
{
class Program
{
static void Main(string[] args)
{
ItWorksWellAndThrowsException();
//ItShouldThrowAExceptionButStallsInstead();
}
private static void ItShouldThrowAExceptionButStallsInstead()
{
Task.Run(async () =>
{
var coordinator = new CancellationHelper();
var waitHandle = new ManualResetEvent(false);
var task = Task.Run(() =>
{
waitHandle.WaitOne();
//this works well though - …Run Code Online (Sandbox Code Playgroud) c# asynchronous task cancellationtokensource cancellation-token
我有一个部署在Windows Server 2008中的Work Tracker WPF应用程序,此Tracker应用程序正在与(Tracker)Windows服务VIA WCF服务进行通信.
用户可以从Worker Tracker GUI应用程序创建任何工作条目/编辑/添加/删除/取消任何工作条目.在内部,它将向Windows服务发送请求.Windows服务将获取工作请求并在多线程中处理它.每个workrequest条目实际上将在输出文件夹位置创建n个工作文件(基于工作优先级).
因此,每个工作请求将完成工作添加过程.
现在我的问题是如果我取消当前创建的工作条目.我想在RUNTIME中停止当前的Windows服务工作.为工作创建输出文件的当前线程应该是STOPPED.所有线程都应该被杀死.一旦用户请求取消,就应删除所有线程资源.
我的解决方法:
我使用Windows Service On Custom Command方法在运行时将自定义值发送到Windows服务.我在这里实现的是它正在处理当前工作或当前线程(即为收到的工作项创建输出文件).然后它将转到自定义命令以取消请求.
有没有办法让我们在获得自定义命令后停止工作项请求.
任何工作都非常感谢.
我想取消正在运行的任务(当用户按下退出键时)。当我点击“escape”键 Form_KeyDown 运行但不取消任务时!
CancellationTokenSource tokenSource = new CancellationTokenSource();
CancellationToken token=new CancellationToken();
private async void Search_Button_ClickAsync(object sender, EventArgs e)
{
token = tokenSource.Token;
await (Task.Factory.StartNew(() =>
{
//...my program
},
token));
private void Form_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Escape)
{
tokenSource.Cancel();
}
}
Run Code Online (Sandbox Code Playgroud) c# task cancellation cancellationtokensource cancellation-token
asp.net core 中的 thread.Abort() 是否有任何替代选项,因为它不再支持 .Core。
// Exceptions:
// T:System.PlatformNotSupportedException:
// .NET Core only: This member is not supported.
Run Code Online (Sandbox Code Playgroud)
这是抛出 PlatformNotSupportedException 异常。
我使用了 thread.Interrupt() 但它没有按预期工作。
我有创建 CancellationTokenSource 并将其传递给方法的代码。
我在另一个发出 cts.Cancel(); 的应用程序中有代码。
有没有一种方法可以使该方法立即停止,而不必等待 while 循环内的两行完成?
请注意,如果它导致我可以处理的异常,我会没事的。
public async Task OnAppearing()
{
cts = new CancellationTokenSource();
await GetCards(cts.Token);
}
public async Task GetCards(CancellationToken ct)
{
while (!ct.IsCancellationRequested)
{
App.viewablePhrases = App.DB.GetViewablePhrases(Settings.Mode, Settings.Pts);
await CheckAvailability();
}
}
Run Code Online (Sandbox Code Playgroud) c# ×9
task ×3
cancellation ×2
.net ×1
.net-4.0 ×1
.net-4.5 ×1
abort ×1
asynchronous ×1
winforms ×1