-2

I am trying to retrieve all of the stock prices added into an arraylist using the YahooFinanceApi, the code normally works fine but as soon as I add it into a loop the Async task does not want to retrieve the required information. Found the reference code here https://www.youtube.com/watch?v=hPYUjOwSKcQ.
Any help would be appreciated

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using YahooFinanceApi;
using System.Collections;
using System.Diagnostics;

namespace StockAlert
{
    public partial class Main : Form
    {
        public Main()
        {
            InitializeComponent();
        }

        private void Main_Load(object sender, EventArgs e)
        {
        }

        public void simpleButton1_Click(object sender, EventArgs e)
        {
            // Retrieve stock data
            ArrayList Stocks = getStocks();
            for (int i = 0; i < Stocks.Count; i++)
            {
                DoAsync(Stocks[i].ToString());
                i++;
            }
        }

        public static Task DoAsync(string Item)
        {
            string sstart = "2022/02/08";
            string ssend = "2022/02/09";
            DateTime start = Convert.ToDateTime(sstart);
            DateTime end = Convert.ToDateTime(ssend);

            Task.Delay(1000);
            // Retrieve stock data
            var awaiter = getstockData(Item, start, end);              
            return Task.CompletedTask;
        }

        // The problem occurs here should go on instead on Continuing with the loop
        public static async Task<int> getstockData(string symbol, DateTime startdate, DateTime enddate)
        {
            try
            {
                var historical_data = await Yahoo.GetHistoricalAsync(symbol, startdate, enddate);
                await Task.Delay(100);
                var security = await Yahoo.Symbols(symbol).Fields(Field.LongName).QueryAsync();
                var ticker = security[symbol];
                var companyname = ticker[Field.LongName];

                for (int i = 0; i < historical_data.Count; i++)
                {
                    // When out of the arraylist loop, this part normally Retrieves the values.
                    decimal open = historical_data.ElementAt(i).Open;
                    decimal close = historical_data.ElementAt(i).Close;
                }
            }
            catch (Exception ex)
            {
            }
            return 1;
        }
    
        public static ArrayList getStocks()
        {
            ArrayList Stocks = new ArrayList();

            Stocks.Add("BABA");
            Stocks.Add("AMD");
            Stocks.Add("MMM");
            Stocks.Add("ABT");
            Stocks.Add("ABBV");
            Stocks.Add("CAN");
            Stocks.Add("ATVI");
            Stocks.Add("ADBE");
            Stocks.Add("AAP");
            Stocks.Add("AIR.PA");
            Stocks.Add("AA");
            Stocks.Add("ALGN");
            Stocks.Add("ALV.DE");
            Stocks.Add("MO");
            Stocks.Add("AMZN");
            Stocks.Add("AMGN");
            Stocks.Add("BUD");
            Stocks.Add("ANSS");
            Stocks.Add("AAPL");
            Stocks.Add("T");
            Stocks.Add("ACB ");
            Stocks.Add("ADSK");
            Stocks.Add("BIDU");
            Stocks.Add("SAN");
            Stocks.Add("BAC");
            Stocks.Add("BCS");
            Stocks.Add("BAYN.DE");
            Stocks.Add("BBY");
            Stocks.Add("BYND");
            Stocks.Add("BMW");
            Stocks.Add("BA");
            Stocks.Add("BMY");
            Stocks.Add("CGC");
            Stocks.Add("CAT");
            Stocks.Add("CTL");
            Stocks.Add("CVX");
            Stocks.Add("CTAS");
            Stocks.Add("CSCO");
            Stocks.Add("C");
            Stocks.Add("CTXS");
            Stocks.Add("KO");
            Stocks.Add("CL");
            Stocks.Add("CMCSA");
            Stocks.Add("CBK");
            Stocks.Add("CXO");
            Stocks.Add("COP");
            Stocks.Add("ED");
            Stocks.Add("CON");
            Stocks.Add("COST");
            Stocks.Add("CRON");
            Stocks.Add("CVS");
            Stocks.Add("DHI");
            Stocks.Add("DAI.DE");
            Stocks.Add("DHR");
            Stocks.Add("DRI");
            Stocks.Add("DVA");
            Stocks.Add("DAL");
            Stocks.Add("DB ");
            Stocks.Add("DPW");
            Stocks.Add("DRE");
            Stocks.Add("DVN");
            Stocks.Add("DLR");
            Stocks.Add("DFS");
            Stocks.Add("DISCA");
            Stocks.Add("DIS");
            Stocks.Add("DOV");
            Stocks.Add("DBX");
            Stocks.Add("DTE");
            Stocks.Add("DRE");
            Stocks.Add("EMN");
            Stocks.Add("EZJ.L");
            Stocks.Add("EBAY");
            Stocks.Add("ECL");
            Stocks.Add("EIX");
            Stocks.Add("EMR");
            Stocks.Add("ENEL.MI");
            Stocks.Add("Entergy");
            Stocks.Add("EQT");
            Stocks.Add("EFX");
            Stocks.Add("EQR");
            Stocks.Add("ESS");
            Stocks.Add("ETFC");
            Stocks.Add("EXPD");
            Stocks.Add("EXR");
            Stocks.Add("XOM");
            Stocks.Add("FFIV");
            Stocks.Add("FB");
            Stocks.Add("FRT");
            Stocks.Add("RACE");
            Stocks.Add("FCAU");
            Stocks.Add("FIS");
            Stocks.Add("FITB");
            Stocks.Add("FSLR");
            Stocks.Add("FE");
            Stocks.Add("FISV");
            Stocks.Add("FLS");
            Stocks.Add("FMC");
            Stocks.Add("FBHS");
            Stocks.Add("FCX");
            Stocks.Add("GE");
            Stocks.Add("GM");
            Stocks.Add("GILD");
            Stocks.Add("GS");
            Stocks.Add("GOOGL");
            Stocks.Add("GWPH");
            Stocks.Add("HAS");
            Stocks.Add("KHC");
            Stocks.Add("HON");
            Stocks.Add("HSBA.L");
            Stocks.Add("IBM");
            Stocks.Add("IDXX");
            Stocks.Add("INTC");
            Stocks.Add("JPM");
            Stocks.Add("JUVE");
            Stocks.Add("FDJ.PA");
            Stocks.Add("LMT");
            Stocks.Add("OREP-");
            Stocks.Add("LYFT");
            Stocks.Add("MANU");
            Stocks.Add("MKS.L");
            Stocks.Add("MA");
            Stocks.Add("MCD");
            Stocks.Add("MDT");
            Stocks.Add("MELI");
            Stocks.Add("MRK.DE");
            Stocks.Add("MU");
            Stocks.Add("MS");
            Stocks.Add("NFLX");
            Stocks.Add("NEE");
            Stocks.Add("NKE");
            Stocks.Add("NVDA");
            Stocks.Add("PYPL");
            Stocks.Add("PFE");
            Stocks.Add("PM");
            Stocks.Add("PINS");
            Stocks.Add("PIRC");
            Stocks.Add("PST");
            Stocks.Add("PG");
            Stocks.Add("QCOM");
            Stocks.Add("DGX");
            Stocks.Add("RTX");
            Stocks.Add("RMD");
            Stocks.Add("RR.L");
            Stocks.Add("RBS.L");
            Stocks.Add("CRM");
            Stocks.Add("Schlumb");
            Stocks.Add("WORK");
            Stocks.Add("SNAP");
            Stocks.Add("Spotify");
            Stocks.Add("STAN.L");
            Stocks.Add("SBUX");
            Stocks.Add("SYK");
            Stocks.Add("SU");
            Stocks.Add("TFX");
            Stocks.Add("TEF.MC");
            Stocks.Add("TSCO.L");
            Stocks.Add("Tesla");
            Stocks.Add("TLRY");
            Stocks.Add("TMUS");
            Stocks.Add("TFC");
            Stocks.Add("TWTR");
            Stocks.Add("UBER");
            Stocks.Add("UCG.MI");
            Stocks.Add("VZ");
            Stocks.Add("VIAC");
            Stocks.Add("V");
            Stocks.Add("VOD.L");
            Stocks.Add("VOW3.DE");
            Stocks.Add("WBA");
            Stocks.Add("0R1W.IL");
            Stocks.Add("MRW.L");
            Stocks.Add("ZM");

            return Stocks;
        }
    }
}
GSerg
  • 76,472
  • 17
  • 159
  • 346
Dewald
  • 1
  • "does not want to retrieve the required information" - can you please be morre specific what you expect and what you observe? – Klaus Gütter Apr 25 '22 at 18:48
  • 2
    Whatever your problem is (you have not described it), it is unlikely to be related to ArrayList and likely to be related to the fact that you are launching and not awaiting all the `DoAsync`s - by design it would appear as you are specifically returning `Task.CompletedTask` from them to even conceal that it's [fire and forget](https://stackoverflow.com/q/46053175/11683). In particular it means that your `Task.Delay(1000)` has no effect and they all fire at once. – GSerg Apr 25 '22 at 18:51
  • dont silently ignore exceptions, put a MEssageBox.Show there. Second why the fancy async model, why not just async / await – pm100 Apr 25 '22 at 18:52
  • 2
    also dont use ArrayList - `use List` - you get type safety – pm100 Apr 25 '22 at 18:52

1 Answers1

0

Code fixed for you, convert to full async

    public async void simpleButton1_Click(object sender, EventArgs e) {
        // Retrieve stock data
        ArrayList Stocks = getStocks();
        for (int i = 0; i < Stocks.Count; i++) {
            await DoAsync(Stocks[i].ToString());
            //i++;  <<<==== remove doubel increment
           
        }
    }

    public static async  Task<int> DoAsync(string Item) {
        string sstart = "2022/02/08";
        string ssend = "2022/02/09";
        DateTime start = Convert.ToDateTime(sstart);
        DateTime end = Convert.ToDateTime(ssend);

        // Retrieve stock data
        await getstockData(Item, start, end);
        return 1;
    
    }

added trace so you can see it worked

    public static async Task<int> getstockData(string symbol, DateTime startdate, DateTime enddate) {
        try {
            var historical_data = await Yahoo.GetHistoricalAsync(symbol, startdate, enddate);
            await Task.Delay(100);
            var security = await Yahoo.Symbols(symbol).Fields(Field.LongName).QueryAsync();
            var ticker = security[symbol];
            var companyname = ticker[Field.LongName];

            for (int i = 0; i < historical_data.Count(); i++) {
                // When out of the arraylist loop, this part normally Retrieves the values.
                decimal open = historical_data.ElementAt(i).Open;
                decimal close = historical_data.ElementAt(i).Close;
                Debug.WriteLine($"{open} {close} {symbol}"); <<<=== trace
            }

        }
        catch (Exception ex) {
            MessageBox.Show(ex.ToString()); <<<====  dont ignore exceptions 
        }
        return 1;
    }
pm100
  • 48,078
  • 23
  • 82
  • 145