C#股票行情器的异步任务

C#股票行情器的异步任务,c#,timer,responsive-design,task-parallel-library,asynchronous,C#,Timer,Responsive Design,Task Parallel Library,Asynchronous,我一直在努力学习更多关于异步任务和线程的知识,但没有取得很大进展 我正在尝试加载一个“引擎”类型的线程,它将在启动时在后台运行,并且能够访问UI线程来更新变量,而无需挂起UI线程 在下面的代码中,调用了引擎,并创建了一个Ticker对象,它保存了名为Last的当前值(Litecoin/USD),还保存了其他一些有用的值。此代码成功地将当前值分配给label1.text。我不一定需要代码,但我会采取什么方法在后台每秒创建一个ticker对象,并用每个新的ticker对象值更新UI线程 这对背景工作

我一直在努力学习更多关于异步任务和线程的知识,但没有取得很大进展

我正在尝试加载一个“引擎”类型的线程,它将在启动时在后台运行,并且能够访问UI线程来更新变量,而无需挂起UI线程

在下面的代码中,调用了引擎,并创建了一个Ticker对象,它保存了名为Last的当前值(Litecoin/USD),还保存了其他一些有用的值。此代码成功地将当前值分配给label1.text。我不一定需要代码,但我会采取什么方法在后台每秒创建一个ticker对象,并用每个新的ticker对象值更新UI线程

这对背景工作者来说是一个很好的例子吗

    private void Form1_Load(object sender, EventArgs e)
    {
        Engine();
    }
    private void Engine()
    {
        Ticker ltcusd = BtceApi.GetTicker(BtcePair.LtcUsd);
        label1.Text = "LTC/USD:" + ltcusd.Last;
    }
编辑: 如果执行以下操作,label1会由于跨线程操作尝试(UI线程中的label1)而引发InvalidOperationException


您可以尝试在任务结束时继续更新标签。如果要在任务结束前更新it事件,请在UI线程上引发由注册的事件。然后事件可以更新标签。

使用
async
/
wait
,获取“异步”类API的最简单方法是调用新任务。这不太好,但会让事情变得更简单。我可能会创建一个新类,它基本上将所有
BtceApi
方法包装在任务中:

public class BtceApiAsync
{
    public Task<Ticker> GetTickerAsync(BtcePair pair)
    {
        return Task.Run(() => BtceApi.GetTicker(pair));
    }

    // etc
}
请注意,这并不意味着屏幕将每秒更新一次。。。每秒将启动一个新任务,一旦每个任务完成,UI将更新


在这里使用
wait
——从UI线程上启动的异步方法——意味着您无需担心UI的使用;整个异步方法将在UI线程上执行,即使获取本身发生在不同的线程中。

我想这是Windows窗体。您可以使用“旧式风格”并在UI线程上设置标签文本,您可以通过将委托传递给or方法来实现这一点


您是否正在使用.NET 4.5和C#5?是(输入至少15个字符),并且
BtceApi
是否在您的控制之下?(理想情况下,您应该尽可能多地实现异步,这样您甚至不需要另一个线程。)它在这里可用,我可以修改它。显然,我没有写。隐马尔可夫模型。。。没有明显的异步API。我想你可以启动一个单独的任务…我希望我可以投票,但显然我还没有足够的代表,这也起了作用。谢谢你的帮助。太棒了,这种方法对我来说很有意义。谢谢你抽出时间。
public class BtceApiAsync
{
    public Task<Ticker> GetTickerAsync(BtcePair pair)
    {
        return Task.Run(() => BtceApi.GetTicker(pair));
    }

    // etc
}
// Keep a field of type System.Windows.Forms.Timer
timer = new Timer();
timer.Interval = 1000;
timer.Tick += DisplayTicker;
timer.Start();

...

private async void DisplayTicker(object sender, EventArgs e)
{
    Ticker ticker = await BtceApiAsync.GetTickerAsync(BtcePair.LtcUsd);
    label1.Text = "LTC/USD: " + ltcusd.Last;
}
   private void Engine()
   {
      while (true)
     {
        Thread.Sleep(1000);
        Ticker ltcusd = BtceApi.GetTicker(BtcePair.LtcUsd);
        UpdateText("LTC/USD: " + ltcusd.Last);
      }
    }
    private void UpdateText(string text)
    {
        //Inspect if the method is executing on background thread
        if (InvokeRequired)
        {
           //we are on background thread, use BeginInvoke to pass delegate to the UI thread
            BeginInvoke(new Action(()=>UpdateText(text)));
        }
        else
        {
           //we are on UI thread, it's ok to change UI
           label1.Text = text;            
        }
    }