1

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

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

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

这似乎很可能是错误的,而且非常丑陋。有没有更好的办法?

4

2 回答 2

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);
    }
于 2013-06-11T19:03:47.770 回答
1

如果您需要异步和任务支持,我强烈建议您查看 Microsoft BCL 库。它与便携式类库兼容。

只需使用 nuget 搜索即可。

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

于 2013-06-11T19:05:00.670 回答