我想在 C# 中运行一段代码(或方法)。在这个块中,我使用 Web 服务方法。我想在超时的情况下异步运行它(以避免冻结应用程序)。我的代码是:
SmsSender s = new SmsSender();
dataGrid.ItemsSource =
s.GetAllInboxMessagesDataSet().Tables[0].DefaultView;
在此之前,我使用 thread.Abort。最后我发现那个线程。Abrot是邪恶的
请帮我
我想在 C# 中运行一段代码(或方法)。在这个块中,我使用 Web 服务方法。我想在超时的情况下异步运行它(以避免冻结应用程序)。我的代码是:
SmsSender s = new SmsSender();
dataGrid.ItemsSource =
s.GetAllInboxMessagesDataSet().Tables[0].DefaultView;
在此之前,我使用 thread.Abort。最后我发现那个线程。Abrot是邪恶的
请帮我
如果您使用的是 C# 4.5,您可以这样做:
var cts = new CancellationTokenSource(3000); // Set timeout
var task = Task.Run(() =>
{
while (!cts.Token.IsCancellationRequested)
{
// Working...
}
}, cts.Token);
该问题有不同的解决方案(不要冻结主线程)。我的解决方案是创建一个任务并在其中创建我等待的第二个任务。包装器任务不会被等待或加入阻塞,因此主线程不会被阻塞。通过事件,我可以通知调用者工作任务是否超时。代码如下所示:
// 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
}
});