none
=================静态构造函数中调用异步方法(await)============== RRS feed

  • 问题

  • 我希望可以在静态构造函数中调用一个await的异步方法如下:

    internal static readonly List<Tuple<byte, string, string>> AllSystemType;
    
            static SystemType()
            {
                AllSystemType = await Gets();
            }
    
            private async static Task<List<Tuple<byte, string, string>>> Gets()
            {}

    但很显然,不能对静态构造函数加async。

    对此有什么好的办法或建议吗?谢谢。

    2012年11月28日 3:08

答案

  • dear

    1.基本上 不应该 对建构函数进行非同步处理,不管是静态还是非静态,如果你需要非同步实例化List,應將它包装成一个async method

    2.方法宣告中若使用了async,方法体内要有await,否则会取得错误的值

            private static async Task<List<Tuple<byte, string, string>>> getListAsync()
            {
                return await Task<List<Tuple<byte, string, string>>>.Factory.StartNew(() => getList());
            }
    
            private static List<Tuple<byte, string, string>> getList()
            {
                if (AllSystemType == null)
                {
                    AllSystemType = new List<Tuple<byte, string, string>>();
                }
    
                //TODO:做要做的事
                return AllSystemType;
            }



    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2012年11月29日 3:59

全部回复

  • 自己封装一下,建议使用单例模式:

      public class AsyncClass
        {
            internal static readonly List<Tuple<bytestringstring>> AllSystemType;
            private static object obj = new object();
     
            public async static Task<List<Tuple<bytestringstring>>> Gets()
            {
                lock (obj)
                {
                    if (AllSystemType == null)
                    {
                        lock (obj)
                        {
                            //初始化
                        }
                    }
                }
                return AllSystemType;
            }
        }

    我的博客园
    慈善点击,点击此处
    和谐拯救危机,全集下载,净化人心

    2012年11月28日 7:17
    版主
  • 感谢你的回复。

    你这样的做法是必须在类的方法上进行调用。而我的本意是想在静态构造函数中初始化。

    而且你这样的话,我将AllSystemType修饰为internal就没有意义了。

    2012年11月28日 9:37
  • dear

    1.基本上 不应该 对建构函数进行非同步处理,不管是静态还是非静态,如果你需要非同步实例化List,應將它包装成一个async method

    2.方法宣告中若使用了async,方法体内要有await,否则会取得错误的值

            private static async Task<List<Tuple<byte, string, string>>> getListAsync()
            {
                return await Task<List<Tuple<byte, string, string>>>.Factory.StartNew(() => getList());
            }
    
            private static List<Tuple<byte, string, string>> getList()
            {
                if (AllSystemType == null)
                {
                    AllSystemType = new List<Tuple<byte, string, string>>();
                }
    
                //TODO:做要做的事
                return AllSystemType;
            }



    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2012年11月29日 3:59
  • 感谢你的回复。

    你这样的做法是必须在类的方法上进行调用。而我的本意是想在静态构造函数中初始化。

    而且你这样的话,我将AllSystemType修饰为internal就没有意义了。


    对构造函数、析构函数啥进行同步本身就是毫无意义的。

    我的博客园
    慈善点击,点击此处
    和谐拯救危机,全集下载,净化人心
    想更多交流?请点击此处……

    2012年11月30日 7:08
    版主