【问题标题】:Run some code asynchronously with timeout使用超时异步运行一些代码
【发布时间】:2013-10-31 22:14:50
【问题描述】:

我想在 C# 中运行一段代码(或方法)。在这个块中,我使用 Web Service 方法。我想在超时的情况下异步运行它(以避免冻结应用程序)。我的代码是:

SmsSender s = new SmsSender();

dataGrid.ItemsSource = 
    s.GetAllInboxMessagesDataSet().Tables[0].DefaultView;

在此之前,我使用 thread.Abort。最后我发现thread.Abrot是邪恶的

请帮帮我

【问题讨论】:

    标签: c# multithreading timeout


    【解决方案1】:

    如果您使用的是 C# 4.5,您可以这样做:

    var cts = new CancellationTokenSource(3000); // Set timeout
    
    var task = Task.Run(() =>
    {
        while (!cts.Token.IsCancellationRequested)
        {
            // Working...
        }
    
    }, cts.Token);
    

    【讨论】:

    • 谢谢。您的代码看起来不错,但是当将 2000 更改为 60000 ctc.Cancel 在工作完成之前运行!我的工作将在大约 30 秒内完成。为您的努力 +1
    【解决方案2】:

    这个问题有不同的解决方案(不要冻结主线程)。我的解决方案是创建一个任务并在其中创建我等待的第二个任务。包装器任务不会被等待或加入阻塞,因此主线程不会被阻塞。通过事件,我可以通知调用者 worker 任务是否超时。代码如下所示:

    // create asynchronous task. in order not to block the calling thread,
    // create and start another task in this one and wait for its completion
    var synchronize = new System.Threading.Tasks.Task(() =>
    {                   
        var worker = new System.Threading.Tasks.TaskFactory().StartNew(() =>
        {
            // do something work intensive
        });                 
        var workCompleted = worker.Wait(10000 /* timeout */);
        if (!workCompleted)
        {
            // worker task has timed-out
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-10
      • 1970-01-01
      • 1970-01-01
      • 2012-03-26
      • 2015-08-10
      • 1970-01-01
      • 2012-04-17
      相关资源
      最近更新 更多