Iva*_*van 3 c# begininvoke winforms async-await
我有一个apiClient.OrderSend必须在"GUI"线程内调用的函数,所以我创建了这个函数
private void RunOnUIThread(Action action)
{
this.BeginInvoke(action);
}
Run Code Online (Sandbox Code Playgroud)
然后,我有一个需要的功能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;
}
Run Code Online (Sandbox Code Playgroud)
问题是AlgoSendOrder返回之前apiClient.OrderSend返回,因此retVal对于此函数的客户端始终为-1.
看来这个合理的改变就是await-async在GUI线程中使用pair执行函数,并具有等待返回值的预期效果.但是我似乎无法让它发挥作用.
好像我应该可以返工RunOnUIThread使用async-await
public async Task RunOnUIThreadAsync()
{
if (InvokeRequired)
{
// what do I put here?
}
{
… // like before (but can now use `await` expressions)
}
}
Run Code Online (Sandbox Code Playgroud)
使用异步方法在单独的线程中执行后台任务.请注意以下示例中的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;
}
Run Code Online (Sandbox Code Playgroud)
在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
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2913 次 |
| 最近记录: |