使用异步任务主从c#类库访问.ToList()

时间:2018-09-06 11:04:13

标签: c# asynchronous console-application

我有一个静态版本的这种类型的代码在静态版本中工作。但是,API调用非常慢。现在,由于C#7支持控制台异步任务(我在其中添加代码以连接到数据库并存储数据),因此我试图转向异步。我想在控制台上看到此代码输出以确保其正常工作,因此我可以为加载分配变量我似乎无法弄清楚如何从main中访问列表。这是到目前为止的代码:

包装器(或C#库):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace AlphaVantageApiWrapper
{
    public static class AlphaVantageApiWrapper
    {
        public static async Task<AlphaVantageRootObject> GetTechnical(List<ApiParam> parameters, string apiKey)
        {
            var stringRequest = parameters.Aggregate(@"https://www.alphavantage.co/query?", (current, param) => current + param.ToApiString());
            stringRequest += "&apikey=" + apiKey;

            var apiData = await CallAlphaVantageApi(stringRequest);

            var technicalsObject = new AlphaVantageRootObject
            {
                MetaData = new MetaData
                {
                    Function = parameters.FirstOrDefault(x => x.ParamName.Equals("function"))?.ParamValue ?? "NA?",
                    Interval = parameters.FirstOrDefault(x => x.ParamName.Equals("interval"))?.ParamValue ?? "NA?",
                    SeriesType = parameters.FirstOrDefault(x => x.ParamName.Equals("series_type"))?.ParamValue ?? "NA?",
                    Symbol = parameters.FirstOrDefault(x => x.ParamName.Equals("symbol"))?.ParamValue ?? "NA?"
                },

                TechnicalsByDate = apiData.Last.Values().OfType<JProperty>().Select(x => new TechnicalDataDate
                {
                    Date = Convert.ToDateTime(x.Name),
                    Data = x.Value.OfType<JProperty>().Select(r => new TechnicalDataObject
                    {
                        TechnicalKey = r.Name,
                        TechnicalValue = Convert.ToDouble(r.Value.ToString())
                    }).ToList()
                })
                    .ToList()
            };

            return technicalsObject;
        }

        public class ApiParam
        {
            public string ParamName;
            public string ParamValue;

            public ApiParam(string paramNameIn, string paramValueIn)
            {
                ParamName = paramNameIn;
                ParamValue = paramValueIn;
            }

            public string ToApiString()
            {
                return $"&{ParamName}={ParamValue}";
            }
        }

        public static string ToDescription(this Enum enumeration)
        {
            var type = enumeration.GetType();
            var memInfo = type.GetMember(enumeration.ToString());
            if (memInfo.Length <= 0) return enumeration.ToString();
            var attrs = memInfo[0].GetCustomAttributes(typeof(EnumDescription), false);
            return attrs.Length > 0 ? ((EnumDescription)attrs[0]).Text : enumeration.ToString();
        }

        public static async Task<JObject> CallAlphaVantageApi(string stringRequest)
        {
            try
            {
                using (var client = new HttpClient())
                {
                    var res = await client.GetStringAsync(stringRequest);
                    return JsonConvert.DeserializeObject<JObject>(res);
                }
            }
            catch (Exception e)
            {
                //fatal error
                return null;
            }
        }

        public class AlphaVantageRootObject
        {
            public MetaData MetaData;
            public List<TechnicalDataDate> TechnicalsByDate;
        }

        public class MetaData
        {
            public string Function;
            public string Interval;
            public string SeriesType;
            public string Symbol;
        }

        public class TechnicalDataDate
        {
            public DateTime Date;
            public List<TechnicalDataObject> Data;
        }

        public class TechnicalDataObject
        {
            public string TechnicalKey { get; set; }
            public double TechnicalValue { get; set; }
        }

        public class EnumDescription : Attribute
        {
            public string Text { get; }

            public EnumDescription(string text)
            {
                Text = text;
            }
        }

        public enum AvFuncationEnum
        {
            [EnumDescription("SMA")] Sma,
            [EnumDescription("EMA")] Ema,
            [EnumDescription("MACD")] Macd,
            [EnumDescription("STOCH")] Stoch,
            [EnumDescription("RSI")] Rsi,
        }

        public enum AvIntervalEnum
        {
            [EnumDescription("1min")] OneMinute,
            [EnumDescription("5min")] FiveMinutes,
            [EnumDescription("15min")] FifteenMinutes,
            [EnumDescription("30min")] ThirtyMinutes,
            [EnumDescription("60min")] SixtyMinutes,
            [EnumDescription("daily")] Daily,
            [EnumDescription("weekly")] Weekly,
            [EnumDescription("monthly")] Monthly
        }

        public enum AvSeriesType
        {
            [EnumDescription("close")] Close,
            [EnumDescription("open")] Open,
            [EnumDescription("high")] High,
            [EnumDescription("low")] Low,
        }
    }
}

` C#异步主要任务(显然不起作用)...

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AlphaVantageApiWrapper.Test
{
    public static class AlphaVantageApiDbLoader
    {
        public static async Task Main(string[] args)

        {
            var API_KEY = "EnterAPIHERE";

            var StockTickers = new List<string> { "AAPL" };  //eventualy becomes a list pulled in from the DB for processing

            foreach (var ticker in StockTickers)
            {
                var parameters = new List<AlphaVantageApiWrapper.ApiParam>
                {
                    new AlphaVantageApiWrapper.ApiParam("function", AlphaVantageApiWrapper.AvFuncationEnum.Sma.ToDescription()),
                    new AlphaVantageApiWrapper.ApiParam("symbol", ticker),
                    new AlphaVantageApiWrapper.ApiParam("interval", AlphaVantageApiWrapper.AvIntervalEnum.Daily.ToDescription()),
                    new AlphaVantageApiWrapper.ApiParam("time_period", "5"),
                    new AlphaVantageApiWrapper.ApiParam("series_type", AlphaVantageApiWrapper.AvSeriesType.Open.ToDescription()),
                };

                //Start Collecting SMA values

                var SMA_5 = await AlphaVantageApiWrapper.GetTechnical(parameters, API_KEY);
                ///var SMA_5Result = AlphaVantageApiWrapper.TechnicalDataObject()   // can't all method error just want values fron list

                parameters.FirstOrDefault(x => x.ParamName == "time_period").ParamValue = "20";
                var SMA_20 = await AlphaVantageApiWrapper.GetTechnical(parameters, API_KEY);
                parameters.FirstOrDefault(x => x.ParamName == "time_period").ParamValue = "50";
                var SMA_50 = await AlphaVantageApiWrapper.GetTechnical(parameters, API_KEY);
                parameters.FirstOrDefault(x => x.ParamName == "time_period").ParamValue = "200";
                var SMA_200 = await AlphaVantageApiWrapper.GetTechnical(parameters, API_KEY);

                //Change function to EMA

                //Change function to RSI

                //Change function to MACD


            }
        }
    }
}

任何帮助将不胜感激!我知道代码在后台运行,只是似乎无法在控制台屏幕上查看它。最终,我将分配符号,日期,返回值的变量并将其读取到数据库。我习惯于使用DataTables,但是async和.ToList对我来说是新的。谢谢!

0 个答案:

没有答案