繁体   English   中英

除非添加Thread.Sleep,否则无法使Task.Result返回字符串

[英]Can't get Task.Result to return string unless I add a Thread.Sleep

第一次在这里提出问题时,我会尝试尽可能具体。

我在工作时使用的是基于WebBase的Api,但我很难让Task返回结果。

我有一个带有Buy方法和GetOrderNumber方法的交易类。 在我的MainForm上,我使用Task执行交易,然后检索与该交易相关的订单号。

NewTrade Test = new NewTrade();

Task<string> tmp = Task.Factory.StartNew(() => Test.Buy("JPM.NY", 100, 59.50));
string reqid = tmp.Result;

Task<string> tmp2 = Task.Factory.StartNew(() => Test.GetOrderNumber(reqid));

Console.WriteLine(tmp2.Result);

第一个任务返回一个REQID号。 第二个任务使用REQID号,并返回实际的交易编号。

我遇到的问题是我从第一个任务获取了ReqID号,但在第二个任务中返回了空白。

但是,如果我在第一个任务和第二个任务之间添加了Thread.sleep(),则会得到订单号。

我之所以使用Tasks,是因为最终会放置成百上千的订单,每个订单的订单号至关重要。

class NewTrade
{ 
   public string Buy(string stkName, int stkShares, double limitPrice)
    {
        try
        {
            using (MyWebClient client = new MyWebClient())
            {

                Stream data = client.OpenRead("http://localhost:8080/ExecuteOrder?symbol=" + stkName + "&limitprice=" + limitPrice + "&ordername=ARCA%20Buy%20ARCX%20Limit%20DAY&shares=" + stkShares);
                StreamReader reader = new StreamReader(data);
                string s = reader.ReadToEnd();
                s = getBetween(s, "<Content>", "</Content>"); //this is a util function to parse the result
                // MessageBox.Show(s.ToString());
                data.Close();
                reader.Close();

                return s;
            }
        }
        catch (WebException e)
        {
            Console.WriteLine(e.Message);
            Console.WriteLine(e.StackTrace);
            return "Nothing";
        }
    }

    public string GetOrderNumber(string id)
    {
        string s = "";

        using (MyWebClient client = new MyWebClient())
        {
            try
            {
                WebRequest request = WebRequest.Create("http://localhost:8080/GetOrderNumber?requestid=" + id);
                WebResponse response = request.GetResponse();
                var reader = new StreamReader(response.GetResponseStream());

                s = reader.ReadToEnd();
                Console.WriteLine(s);
                return s;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
                return "";
            }
        }
    }
}

使用Task可以使您的应用程序更具可伸缩性,因为您可以在异步任务进行时使线程处理其他任务。 话虽这么说,使用Task.RunTask.Factory.StartNew在后台执行IO任务Task.Factory.StartNew达到目的。 您需要通过调用所使用的IO构造的async API来使方法真正async 尝试将代码更改为以下形式:

public Task<string> MakeTradeAsync()
{
    NewTrade Test = new NewTrade();

    string reqid = await Test.Buy("JPM.NY", 100, 59.50);

    string orderNumber = await Test.GetOrderNumber(reqid);

    Console.WriteLine(orderNumber);

    return orderNumber;
}

这将需要您同时使Test.BuyTest.GetOrderNumber异步。 您可以使用async API来访问服务器数据。

 public async Task<string> Buy(string stkName, int stkShares, double limitPrice)
 {
    try
    {
        using (MyWebClient client = new MyWebClient())
        {
            // use async API here to get the data, assuming existance of OpenReadAsync
            Stream data = await client.OpenReadAsync("http://localhost:8080/ExecuteOrder?symbol=" + stkName + "&limitprice=" + limitPrice + "&ordername=ARCA%20Buy%20ARCX%20Limit%20DAY&shares=" + stkShares);
            StreamReader reader = new StreamReader(data);
            string s = reader.ReadToEnd();
            s = getBetween(s, "<Content>", "</Content>"); //this is a util function to parse the result
            // MessageBox.Show(s.ToString());
            data.Close();
            reader.Close();

            return s;
        }
    }
    catch (WebException e)
    {
        Console.WriteLine(e.Message);
        Console.WriteLine(e.StackTrace);
        return "Nothing";
    }
}

public async Task<string> GetOrderNumber(string id)
{
    string s = "";

    using (MyWebClient client = new MyWebClient())
    {
        try
        {
            WebRequest request = WebRequest.Create("http://localhost:8080/GetOrderNumber?requestid=" + id);
            WebResponse response = await request.GetResponseAsync();
            var reader = new StreamReader(response.GetResponseStream());

            s = await reader.ReadToEndAsync();
            Console.WriteLine(s);
            return s;
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
            return "";
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM