Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在超时的情况下异步运行一些代码_C#_Multithreading_Timeout - Fatal编程技术网

C# 在超时的情况下异步运行一些代码

C# 在超时的情况下异步运行一些代码,c#,multithreading,timeout,C#,Multithreading,Timeout,我想在C#中运行一段代码(或方法)。在这个模块中,我使用Web服务方法。我希望在超时的情况下异步运行它(以避免冻结应用程序)。我的代码是: SmsSender s = new SmsSender(); dataGrid.ItemsSource = s.GetAllInboxMessagesDataSet().Tables[0].DefaultView; 在此之前,我使用thread.Abort。终于我发现了那条线索。艾伯特是邪恶的 请帮助我如果您使用的是C#4.5,您可以这样做:

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

SmsSender s = new SmsSender();

dataGrid.ItemsSource = 
    s.GetAllInboxMessagesDataSet().Tables[0].DefaultView;
在此之前,我使用thread.Abort。终于我发现了那条线索。艾伯特是邪恶的

请帮助我

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

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

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

}, cts.Token);

问题有不同的解决方案(不是冻结主线程)。我的解决方案是创建一个任务,并在其中创建我等待的第二个任务。包装器任务没有被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
    }
});

非常感谢。您的代码看起来不错,但当更改2000到60000 ctc时。在工作完成之前取消运行!我的工作大约在30秒内完成+谢谢你的努力