标签: cancellation

如何使用停止按钮停止运行Java代码

我有一个按钮从调用Bean调用方法.此方法允许从解析html代码中提取数据.当该方法运行时,我有一个显示进度条和命令按钮的对话框Cancel.我需要当用户单击取消按钮时,提取按钮调用的方法停止.

这是我的HTML代码:

<p:commandButton
    value="Start" style="width: 12%;height: 100%"
    update=":confirmPurchase, :confirmPurchaseTest, :mainform" id="extractbutton"
    ajax="true" widgetVar="ButtonExtract"
    actionListener="#{mailMB.searchEmails()}" 
    icon="ui-icon-disk" styleClass="ui-priority-primary"
    onstart="blockUIWidget1.show();" oncomplete=" blockUIWidget1.hide();" />

<p:dialog  widgetVar="blockUIWidget1" header="Hitonclick" modal="true"
    resizable="false" closable="false">
    <table border="0" style="width: 500px">
        <tbody > 
            <tr>  
                <td>
                    <p:graphicImage url="pictures/loading81.gif" width="200" height="200" alt="animated-loading-bar"/>
                </td>
                <td>
                    <h:outputLabel value="Extracting is in progress. Please wait..."/>
                    <div align="center">
                        <p:commandButton value="Cancel" title="Cancel" />
                    </div>
                </td>
            </tr>
            <div align="right">

            </div>
        </tbody>
    </table>
</p:dialog>
Run Code Online (Sandbox Code Playgroud)

这是我的sessionScoped Bean中的searchEmails方法

 public void searchEmails() throws Exception {
        idCustomer = (String) session.getAttribute("idCustomer");
        System.out.println(idCustomer + " …
Run Code Online (Sandbox Code Playgroud)

java java-ee primefaces cancellation

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

how can I cancel an Ajax request?

In phonegap how to cancel an ajax request in program, I would like to set cancel button for control the request when it's too slow

$.ajax({
    type: "GET",
    url: url,
    success: function(m) {
        alert( "success");
    }
});
Run Code Online (Sandbox Code Playgroud)

javascript ajax jquery cancellation

11
推荐指数
2
解决办法
2272
查看次数

任何区分取消和超时的方法

我有一些代码通过调用许多其他服务来验证某些数据.我并行启动所有调用,然后等到其中至少一个完成.如果任何请求失败,我不关心其他调用的结果.

我打电话,HttpClient我已经通过了HttpMessageHandler一个记录.实质上:

protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
    HttpResponseMessage response = null;

    try
    {
        response = await base.SendAsync(request, cancellationToken);
    }
    catch (OperationCanceledException ex)
    {
        LogTimeout(...);
        throw;
    }
    catch (Exception ex)
    {
        LogFailure(...);
        throw;
    }
    finally
    {
        LogComplete(...);
    }

    return response;
}
Run Code Online (Sandbox Code Playgroud)

当我取消请求时,我遇到麻烦的部分没有.当我取消请求时,我是故意这样做的,所以我不希望它被记录为超时,但是在取消和实际超时之间似乎没有任何区别.

反正有没有完成这个?

编辑: 我需要澄清一下这一点.并行调用的服务是使用超时传递CancellationTokens:

var ct = new CancellationTokenSource(TimeSpan.FromSeconds(2));
Run Code Online (Sandbox Code Playgroud)

因此,当服务器响应时间超过两秒时,我得到一个OperationCanceledException,如果我手动取消令牌源(比如因为另一台服务器在1秒后返回错误),那么我仍然得到一个OperationCanceledException.理想情况下,我将能够看到CancellationToken.IsCancellationRequested以确定它是否被取消,由于超时,而不是明确要求被取消,但现在看来,你得到相同的值,而不管怎么就被取消了.

c# http cancellation cancellationtokensource dotnet-httpclient

11
推荐指数
2
解决办法
3307
查看次数

如果在取消点调用信号处理程序会发生什么?

例如read,假设应用程序在取消点被阻止,并且接收到信号并调用信号处理程序.Glibc/NPTL通过在系统调用期间启用异步取消来实现取消点,因此据我所知,异步取消将在信号处理程序的整个持续时间内保持有效.这当然是非常错误的,因为有很多函数不是异步取消安全的,但是要求从信号处理程序调用是安全的.

这让我有两个问题:

  • 我错了还是glibc/NPTL的行为真的被危险地打破了?如果是这样,这种危险行为是否符合要求?
  • 根据POSIX,如果在进程执行取消点的函数时调用信号处理程序,应该会发生什么?

编辑:我几乎确信自己,任何潜在目标的线程pthread_cancel必须确保永远不能从该线程的上下文中的信号处理程序调用取消点的函数:

一方面,任何可以在可能被取消并且使用任何async-cancel-unsafe函数的线程中调用的信号处理程序必须在调用任何取消点的函数之前禁用取消.这是因为,从信号中断的代码的角度来看,任何这种取消都等同于异步取消.另一方面,信号处理程序无法禁用取消,除非在调用信号处理程序时将运行的代码仅使用异步信号安全函数,因为pthread_setcancelstate它不是异步信号安全的.

c linux posix pthreads cancellation

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

使用LINQ和CancellationToken的正确方法

我正在尝试编写一个LINQ查询,该查询将支持使用CancellationToken.NET框架中提供的机制进行取消.但是,目前还不清楚将取消和LINQ结合起来的正确方法是什么.

使用PLINQ,可以编写:

 var resultSequence = sourceSequence.AsParallel()
                                    .WithCancellation(cancellationToken)
                                    .Select(myExpensiveProjectionFunction)
                                    .ToList();
Run Code Online (Sandbox Code Playgroud)

不幸的是,WithCancellation()仅适用于ParallelEnumerable- 因此它不能与普通的旧LINQ查询一起使用.当然,可以使用WithDegreeOfParallelism(1)将并行查询转换为顺序查询 - 但这显然是一个黑客攻击:

 var resultSequence = sourceSequence.AsParallel()
                                    .WithDegreeOfParallelism(1)
                                    .WithCancellation(cancellationToken)
                                    .Select(myExpensiveProjectionFunction)
                                    .ToList();
Run Code Online (Sandbox Code Playgroud)

我还想避免Task为这个操作创建一个单独的,因为我需要在几个地方执行此操作,并且我需要能够控制在某些情况下运行此代码的线程.

因此,如果没有编写我自己的实现WithCancellation()- 是否有另一种方法可以实现同样的目的?

.net c# linq parallel-processing cancellation

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

是否有任何关于指定C++异常和pthread取消的交互的动作?

GNU C库现在使用DWARF2展开来进行pthread取消,这样C++异常和pthread取消清理处理程序都可以通过公共调用框架展开进程调用,该过程在必要时调用自动对象的析构函数.不过,据我所知,仍然没有标准,规定(POSIX)线程和C++之间的相互作用,可能希望可移植的应用程序应当假定抛出异常出取消清理上下文是一样调用未定义longjmp出其中,取消具有非平凡析构函数的实时自动对象的线程也是未定义的行为.

是否有任何标准化过程正在进行中,以解决这种相互作用,或者是否可以预期未来的未定义?C++ 11在其线程支持中是否有任何类似的POSIX线程消除概念?

c c++ posix pthreads cancellation

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

Task.Wait在OperationCanceledException的情况下出现意外行为

考虑以下代码:

CancellationTokenSource cts0 = new CancellationTokenSource(), cts1 = new CancellationTokenSource();
try
{
    var task = Task.Run(() => { throw new OperationCanceledException("123", cts0.Token); }, cts1.Token);
    task.Wait();
}
catch (AggregateException ae) { Console.WriteLine(ae.InnerException); }
Run Code Online (Sandbox Code Playgroud)

由于MSDN任务应该是在Faulted状态,因为它的令牌不匹配异常的令牌(也IsCancellationRequested就是false):

如果令牌的IsCancellationRequested属性返回false,或者异常的令牌与Task的令牌不匹配,则OperationCanceledException被视为正常异常,导致Task转换到Faulted状态.

当我使用.NET 4.5.2在控制台应用程序中启动此代码时,我得到Canceled状态任务(聚合异常包含未知TaskCanceledExeption,而不是原始).并且原始异常的所有信息都将丢失(消息,内部异常,自定义数据).

我也注意到的这种行为Task.Wait不同于await task在以下情况下OperationCanceledException.

try { Task.Run(() => { throw new InvalidOperationException("123"); }).Wait(); } // 1
catch (AggregateException ae) { Console.WriteLine(ae.InnerException); }

try { await Task.Run(() => { …
Run Code Online (Sandbox Code Playgroud)

.net c# wait task-parallel-library cancellation

10
推荐指数
2
解决办法
2358
查看次数

F#Async <'T>取消的工作原理是什么?

我对使用TPL在C#中完成异步取消的方式非常满意,但我对F#有点困惑.通过呼叫显然Async.CancelDefaultToken()足以取消传出的Async<'T>操作.但它们没有像我预期的那样被取消,它们只是......消失了...我无法正确检测到取消并正确拆除堆栈.

例如,我有这个代码依赖于使用TPL的C#库:

type WebSocketListener with
  member x.AsyncAcceptWebSocket = async {
    let! client = Async.AwaitTask <| x.AcceptWebSocketAsync Async.DefaultCancellationToken
    if(not(isNull client)) then
        return Some client
    else 
        return None
  }

let rec AsyncAcceptClients(listener : WebSocketListener) =
  async {
    let! result = listener.AsyncAcceptWebSocket
    match result with
        | None -> printf "Stop accepting clients.\n"
        | Some client ->
            Async.Start <| AsyncAcceptMessages client
            do! AsyncAcceptClients listener
  }
Run Code Online (Sandbox Code Playgroud)

CancellationToken传递给x.AcceptWebSocketAsync取消时,返回null,然后AsyncAcceptWebSocket返回方法None.我可以通过断点验证这一点.

但是,AsyncAcceptClients(调用者),永远不会获得该None …

f# cancellation f#-3.0 f#-async

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

在用户空间中实现可取消的系统调用

我正在努力在Linux上实现pthread取消,而不会在我最近的一些其他问题中讨论任何"不愉快的行为"(有些人可能会说错误).到目前为止,取消pthread取消的Linux/glibc方法一直将它视为不需要内核支持的东西,并且可以在库级别处理,纯粹通过在进行系统调用之前启用异步取消,并恢复先前的取消状态在系统调用返回后.这至少有两个问题,其中一个非常严重:

  1. 系统调用从内核空间返回后,但在用户空间保存返回值之前,取消可以执行.如果系统调用分配了资源,则会导致资源泄漏,并且无法使用取消处理程序对其进行修补.
  2. 如果在线程被可取消的系统调用阻塞时处理信号,则整个信号处理程序在启用异步取消的情况下运行.这可能是非常危险的,因为信号处理函数可以调用它们是异步信号安全的,但不是异步取消安全功能.

我解决问题的第一个想法是设置一个标志,线程处于取消点,而不是启用异步取消,并且当设置此标志时,让取消信号处理程序检查保存的指令指针,看它是否指向系统调用指令(特定于arch).如果是这样,这表示系统调用未完成,并且在信号处理程序返回时将重新启动,因此我们可以取消.如果没有,我认为系统调用已经返回,并推迟取消.但是,还存在竞争条件 - 线程可能根本没有到达syscall指令,在这种情况下,系统调用可能会阻塞并且永远不会响应取消.另一个小问题是,如果在输入信号处理程序时设置了取消点标志,则从信号处理程序执行的不可取消的系统调用会被错误地取消.

我正在寻找一种新的方法,并寻找有关它的反馈.必须满足的条件:

  • 在系统调用完成之前收到的任何取消请求必须在系统调用阻塞任何重要时间间隔之前执行,但不会因为信号处理程序中断而挂起重启.
  • 完成系统调用后收到的任何取消请求必须推迟到下一个取消点.

我想到的想法需要为可取消的系统调用包装器进行专门的组装.基本想法是:

  1. 将即将发生的系统调用指令的地址压入堆栈.
  2. 将堆栈指针存储在线程本地存储中.
  3. 从线程本地存储测试取消标志; 如果已设置,则跳转到取消例程.
  4. 进行系统调用.
  5. 清除线程本地存储中保存的指针.

取消操作将涉及:

  1. 在目标线程的线程本地存储中设置取消标志.
  2. 测试目标线程的线程本地存储中的指针; 如果它不为空,则向目标线程发送取消信号.

取消信号处理程序然后:

  1. 检查保存的堆栈指针(在信号上下文中)是否等于线程本地存储中的已保存指针.如果没有,那么取消点被信号处理程序中断,现在没什么可做的.
  2. 检查程序计数器寄存器(保存在信号上下文中)是否小于或等于保存的堆栈指针中保存的地址.如果是这样,这意味着系统调用尚未完成,我们执行取消.

到目前为止我看到的唯一问题是信号处理程序的第1步:如果它决定不动作,那么在信号处理程序返回之后,线程可能会在系统调用上被阻塞,忽略待处理的取消请求.为此,我看到了两个可能的解决方案:

  1. 在这种情况下,安装一个计时器来向特定线程发送信号,基本上每毫秒左右重试一次,直到我们运气好.
  2. 再次提升消除信号,但是从取消信号处理器返回而不取消屏蔽消除信号.当中断的信号处理程序返回时,它将自动取消屏蔽,然后我们可以再试一次.但是,这可能会干扰信号处理程序中取消点的行为.

关于哪种方法最好的想法,或者是否还有其他更基本的缺陷?

c linux posix pthreads cancellation

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

Snakemake 在集群(slurm)取消作业时挂起

也许答案对许多人来说是显而易见的,但我很惊讶我找不到关于这个主题的问题,这对我来说是一个主要问题。我将不胜感激提示!

在由 slurm 管理的集群上提交作业时,如果队列管理器取消作业(例如,资源或时间不足),snakemake 似乎没有收到任何信号,并且永远挂起。另一方面,当作业失败时,snakemake 也会失败,正如预期的那样。这种行为是正常的/想要的吗?当工作被取消时,我怎么能让蛇制作失败?我在 3.13.3 版中遇到了这个问题,它仍然更新到 5.3.0。

例如,在这种情况下,我启动了一个简单的管道,但没有足够的资源用于规则 pluto:

$ snakemake -j1 -p --cluster 'sbatch --mem {resources.mem}' pluto.txt
Building DAG of jobs...
Using shell: /usr/bin/bash
Provided cluster nodes: 1
Unlimited resources: mem
Job counts:
    count   jobs
    1       pippo
    1       pluto
    2

[Tue Sep 25 16:04:21 2018]
rule pippo:
    output: pippo.txt
    jobid: 1
    resources: mem=1000

seq 1000000 | shuf > pippo.txt
Submitted job 1 with external jobid 'Submitted batch job 4776582'.
[Tue Sep 25 16:04:31 2018]
Finished job 1. …
Run Code Online (Sandbox Code Playgroud)

jobs cancellation slurm snakemake

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