首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#时间函数

C#时间函数
EN

Stack Overflow用户
提问于 2015-02-23 11:33:17
回答 2查看 138关注 0票数 1

我有以下问题:

我需要运行一个函数搜索(深度x),它基本上搜索一个决策树直到一定的深度,然后返回(或留在一个类成员)类型的值Move。同时,如果搜索持续太长时间,我希望能够“取消”搜索的执行。

同样重要的是,如果搜索完成得更快,我不需要等待它。我意识到这并不复杂,但我不太熟悉C#并发控制。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-23 15:19:26

这里有一个简单的例子作为起点:

代码语言:javascript
复制
public class Runner
{
    private Task<int> search(CancellationToken ct)
    {
        var t_work = Task.Factory.StartNew<int>(() =>
        {
            int k = 0;

            while (k < 1000)
            {
                if (ct.IsCancellationRequested)
                {
                    return -1;
                }                    
                k += r.Next(200);
                Thread.Sleep(300);
            }
            return k;

        }, ct);
        return t_work;
    }

    Random r = new Random();

    public async Task SearchAsync()
    {
        var timeout = TimeSpan.FromSeconds(3);
        var cts = new CancellationTokenSource(timeout);
        var ct = cts.Token;
        var searchValue = await search(ct);
        string result = (searchValue < 0) ?
            "Search aborted without results" : "search value is: " + searchValue.ToString();
        Console.WriteLine(result);
    }
}

您可以在这样的控制台应用程序中使用它:

代码语言:javascript
复制
Console.WriteLine("test");
var r = new Runner();
r.SearchAsync().Wait();
r.SearchAsync().Wait();
r.SearchAsync().Wait();
r.SearchAsync().Wait();
Console.WriteLine("done..");
票数 1
EN

Stack Overflow用户

发布于 2015-02-23 15:37:12

为此,我将使用Task,因为它内置了处理错误、取消和在任务完成时运行Continuation Tasks的机制。

假设一个自定义返回类型的移动,我认为您在您的问题中暗示:

代码语言:javascript
复制
private Task<Move> _searchTask;
private CancellationTokenSource _searchCancellationTokenSrc;

然后在一个按钮点击或类似,开始你的任务。这将立即返回,保持您的UI响应:

代码语言:javascript
复制
private void StartButton_Click(object sender, RoutedEventArgs e)
{
    _searchCancellationTokenSrc = new CancellationTokenSource();
    CancellationToken ct = _searchCancellationTokenSrc.Token;

    _searchTask = Task.Run(() =>
    {
         for (int i = 0; i < 10; i++ )
         {
             if(ct.IsCancellationRequested)
             {
                 // Clean up here
                 ct.ThrowIfCancellationRequested();
             }
             // Time consuming processing here
             Thread.Sleep(1000);
         }
         return new Move();
    },ct);

    _searchTask.ContinueWith((t) =>
    {
         Console.WriteLine("Canceled");
    }, TaskContinuationOptions.OnlyOnCanceled);

    _searchTask.ContinueWith((t) =>
    {
       Console.WriteLine("Faulted. t.Exception contains details of any exceptions thrown");               
    }, TaskContinuationOptions.OnlyOnFaulted);

    _searchTask.ContinueWith((t) =>
    {            
        Console.WriteLine("Completed t.Result contains your Move object");
    }, TaskContinuationOptions.OnlyOnRanToCompletion);
}

若要取消此操作,请从另一个按钮中删除:

代码语言:javascript
复制
 private void CancelButton_Click(object sender, RoutedEventArgs e)
 {
      _searchCancellationTokenSrc.Cancel();
 }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28672821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档