使用超时异步运行一些代码

时间:2013-10-31 22:14:51

标签: c# multithreading timeout

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

SmsSender s = new SmsSender();

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

在此之前我使用thread.Abort。终于我发现那个帖子.Abrot是邪恶的

请帮帮我

2 个答案:

答案 0 :(得分:1)

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

var cts = new CancellationTokenSource(3000); // Set timeout

var task = Task.Run(() =>
{
    while (!cts.Token.IsCancellationRequested)
    {
        // Working...
    }

}, cts.Token);

答案 1 :(得分:0)

问题有不同的解决方案(不冻结主线程)。我的解决方案是创建一个任务并在其中创建第二个任务,我等待。包装器任务不会被wait或join阻塞,因此主线程不会被阻塞。通过事件,我可以通知呼叫者,工作人员任务已超时。代码如下所示:

// 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
    }
});