2013-10-31 66 views
-1

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

SmsSender s = new SmsSender(); 

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

在此之前我使用thread.Abort。终于我发现,thread.Abrot是邪恶

请帮我

回答

1

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

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

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

}, cts.Token); 
+0

谢谢。你的代码看起来不错,但是当2000到60000 ctc.Cancel在工作完成前运行!我的工作将在大约30秒内完成。 +1为你的努力 –

0

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

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

没有奔跑!并没有检测到超时。谢谢你的馅饼 –

相关问题