相关疑难解决方法(0)

如何在等待中取消任务?

我正在玩这些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)

c# task-parallel-library .net-4.5

147
推荐指数
4
解决办法
13万
查看次数

可以像中止一个Thread(Thread.Abort方法)一样中止一个Task吗?

我们可以中止这样的线程:

Thread thread = new Thread(SomeMethod);
.
.
.
thread.Abort();
Run Code Online (Sandbox Code Playgroud)

但是我可以以相同的方式中止任务(在.Net 4.0中)而不是取消机制.我想立即杀死任务.

c# parallel-processing .net-4.0

57
推荐指数
4
解决办法
9万
查看次数

如何为各种代码块创建通用超时对象?

我有一系列代码块花了太长时间.它失败时我不需要任何技巧.事实上,我想在这些块花费太长时间时抛出异常,并且只是通过我们的标准错误处理而失败.我宁愿不为每个块创建方法(这是我到目前为止看到的唯一建议),因为它需要重新编写代码库.

下面是我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)

c# winforms

7
推荐指数
1
解决办法
727
查看次数

取消执行方法的正确方法

可能重复:
如何中止/取消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)

c# abort task-parallel-library cancellation

6
推荐指数
1
解决办法
979
查看次数

当我在异步方法中调用CancellationTokenSource的Cancel方法时,为什么不取消任务?

我创造了一个小包装CancellationTokenCancellationTokenSource.我遇到的问题是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

6
推荐指数
1
解决办法
4803
查看次数

高优先级的自定义命令Windows服务

我有一个部署在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服务.我在这里实现的是它正在处理当前工作或当前线程(即为收到的工作项创建输出文件).然后它将转到自定义命令以取消请求.

有没有办法让我们在获得自定义命令后停止工作项请求.

任何工作都非常感谢.

.net c# multithreading windows-services

3
推荐指数
1
解决办法
985
查看次数

如何取消正在运行的任务?

我想取消正在运行的任务(当用户按下退出键时)。当我点击“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

2
推荐指数
1
解决办法
8119
查看次数

Asp.net Core 中 thread.Abort() 的替代方案?

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() 但它没有按预期工作。

c# multithreading asp.net-core-mvc asp.net-core-2.1

1
推荐指数
1
解决办法
7629
查看次数

有没有一种方法可以使正在运行的方法立即停止使用 cts.Cancel();

我有创建 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# multithreading task cancellationtokensource

1
推荐指数
1
解决办法
229
查看次数