簡體   English   中英

將BeginInvoke轉換為async / await

[英]Convert BeginInvoke to async/await

我有一個函數apiClient.OrderSend必須在“GUI”線程內調用,所以我創建了這個函數

   private void RunOnUIThread(Action action)
   {
        this.BeginInvoke(action);
   }

然后我有一個需要像這樣return一個int的函數

    int AlgoSendOrder(MT4Order order)
    {
        int retVal = -1;

        RunOnUIThread(() =>
        {
            retVal = apiClient.OrderSend(order.Symbol, (TradeOperation)order.OrderSide, order.Volume,
                                        order.Price, order.AllowedSlippage ?? default(int),
                                        order.PriceToStopLoss ?? default(double),
                                        order.PriceToTakeProfit ?? default(double));
        });

        return retVal;
    }

問題是, AlgoSendOrder之前返回apiClient.OrderSend回報,所以retVal始終是-1到這一功能的客戶端。

似乎這個合理的改變是使用await-async對執行GUI線程中的函數,並具有等待返回值的預期效果。 但是我似乎無法讓它發揮作用。

好像我應該能夠重做RunOnUIThread來使用async-await

public async Task RunOnUIThreadAsync()
{
    if (InvokeRequired)
    {
        // what do I put here?
    }
    {
        … // like before (but can now use `await` expressions)
    }
}

使用異步方法在單獨的線程中執行后台任務。 請注意以下示例中的Task.Run:

async Task<int> AlgoSendOrderAsync(MT4Order order)
{
    int retVal = -1;

    //Doing this on another thread using Task.Run
    await Task.Run(() =>
    {
        retVal = apiClient.OrderSend(order.Symbol, (TradeOperation)order.OrderSide, order.Volume,
                                    order.Price, order.AllowedSlippage ?? default(int),
                                    order.PriceToStopLoss ?? default(double),
                                    order.PriceToTakeProfit ?? default(double));
    });

    return retVal;
}

在UI線程上調用此方法,如下所示:

async void onButtonClickOnWhatever(object sender, EventArgs args)
{
    int result = await AlgoSendOrderAsync(order);
    //Here you are on the UI thread, you can update your controls here safely
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM