我怎么能有一个操作超时在可移植类库



我有一个面向所有对象的可移植类库。正因为如此,没有任务或异步支持。这是非常痛苦的。

所以,我试图实现一个通用的扩展方法,使操作可以超时。这是我目前所看到的:

    public static bool WithTimeout(Action task, int duration)
    {
        bool complete=false;
        ThreadPool.QueueUserWorkItem((o) =>
            {
                task();
                complete = true;
            });
        int timeout = 0;
        while (!complete)
        {
            new ManualResetEvent(false).WaitOne(1);
            timeout++;
            if (timeout > duration)
            {
                return false;
            }
        }
        return true;
    }

这看起来很可能是错的,而且很难看。有没有更好的办法?

@Hans说要正确使用ManualResetEvent。这样做之后,我最终得到了这个(更好的)代码:

    public static bool WithTimeout(Action task, int duration)
    {
        var e=new ManualResetEvent(false);
        ThreadPool.QueueUserWorkItem((o) =>
            {
                task();
                e.Set();
            });
        return e.WaitOne(duration);
    }

如果你想要异步和任务支持,我强烈建议你看看微软的BCL库。它与可移植类库兼容。

用nuget搜索即可。

http://nuget.org/packages/Microsoft.Bcl.Async/

相关内容

  • 没有找到相关文章

最新更新