wh3845348
99887744
采纳率100%
2018-11-22 02:15 阅读 3.7k

C# 给某个方法(带参)设定执行超时时间

40

方法如下 public void getClassNameByHandleValue(Configuration config)
目前想给这个方法设置一个超时时间 如 5秒没有执行完毕的话则返回一个表示,表示在时间内没有执行完方法。

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

3条回答 默认 最新

  • 已采纳
    hxycsdn9159 hxycsdn9159 2018-11-22 02:43

    图片说明
    像这种限时执行方法超时后最好还是要有一定的机制确保调用的方法能够结束释放掉占用的资源,否则很容易就内存泄漏。如果用线程去控制的话可以使用Abort()方法强制结束线程,如果不用线程使用一楼提供的方法的话也要自己在Do这个方法里实现一个检测机制保证方法能够执行完毕正常返回

    点赞 1 评论 复制链接分享
  • showbo GoCityPass新加坡曼谷通票 2018-11-22 02:40
    点赞 1 评论 复制链接分享
  • jie194731 jie194731 2018-11-22 06:26

    先声明一个委托
    public delegate bool GetClassName()
    再声明一个类包括事件通知字段和结果
    public class GetClassNameState
    {
    private AutoResetEvent _are;
    public AutoResetEvent Are
    {
    get { return _are; }
    set { _are = value; }
    }

            private bool _result;
            public bool Result
            {
                get { return _result; }
                set { _result = value; }
            }
    
            public GetClassNameState()
            {
                _are = new AutoResetEvent(false);
                _result = false;
            }
        }
    然后把你的方法赋给声明的委托,用异步回调方法就可以实现超时控制了。
    GetClassName getClassName = new GetClassName(getClassNameByHandleValue)
    GetClassNameState asyncState = new GetClassNameState();
    
            getClassName.BeginInvoke(new AsyncCallback(GetClassNameCallBack), asyncState);
    
            if (asyncState.Are.WaitOne("超时时间"))
            {
                if (asyncState.Result)
                {
                    //执行成功的操作
                }
                else
                {
                    //执行失败的操作
                }
            }
            else
            {
                //超时后执行的操作
            }
    

    public void GetClassNameCallBack(IAsyncResult asyncResult)
    {
    object asyncState = ((AsyncResult)asyncResult).AsyncState;
    GetClassName theGetClassName = (GetClassName)((AsyncResult)asyncResult).AsyncDelegate;
    ((GetClassNameState)asyncState).Result = theGetClassName.GetClassNameState(asyncResult);
    ((GetClassNameState)asyncState).Are.Set();
    }

    手打修改,求采纳啊

    点赞 评论 复制链接分享

相关推荐