如何在Portable Class Libraries中执行操作超时?

时间:2013-06-11 18:42:42

标签: c# .net timeout portable-class-library

我有一个可移植的类库,它针对一切。因此,没有任务或异步支持..这是非常痛苦的。

所以,我正在尝试实现一个通用扩展方法,以便操作可以超时。这就是我到目前为止所做的:

    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;
    }

这似乎很可能虽然错了,但却非常难看。有没有更好的办法?

2 个答案:

答案 0 :(得分:3)

@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);
    }

答案 1 :(得分:1)

如果您想要异步和任务支持,我强烈建议您查看Microsoft BCL库。它与Portable Class Libraries兼容。

只需用nuget搜索它。

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