将 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;
}
问题是在apiClient.OrderSend
returns之前AlgoSendOrder
returns,所以retVal
对于这个函数的客户端来说总是-1。
看来这是一个合理的变化,就是使用await-async
对在GUI线程中执行函数,并达到等待return值的预期效果。但是我似乎无法让它工作。
看来我应该可以返工 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
}
我有一个函数 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;
}
问题是在apiClient.OrderSend
returns之前AlgoSendOrder
returns,所以retVal
对于这个函数的客户端来说总是-1。
看来这是一个合理的变化,就是使用await-async
对在GUI线程中执行函数,并达到等待return值的预期效果。但是我似乎无法让它工作。
看来我应该可以返工 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
}