我正在使用SteamBot应用程序。
我有一个命令应该在特定事件发生时采取行动。在这种特殊情况下,我作为管理员发出命令,机器人等待交易请求,然后继续我的逻辑。我不知道如何让它等到交易请求发生然后继续。
假设我已经发出了命令并且现在在处理该命令行为的函数中。这是我正在尝试做的一个非常简单的例子。
private void giveItemsToUser()
{
Bot.GetInventory();
// Wait here
var items = Trade.CurrentSchema.GetItemsByCraftingMaterial('hat');
foreach (var item in items)
{
added += Trade.AddAllItemsByDefindex(item.Defindex, amount);
}
Trade.SetReady(true);
Trade.AcceptTrade();
}
在该// Wait here
部分中,我希望机器人在交易开始之前停止。然后,一旦它开始,它就可以继续并按预期添加项目。
我尝试在函数中添加一个inTrade
(初始化为false
)变量,然后让机器人进入睡眠状态,直到这是真的。true
OnTradeInit
while (!inTrade)
{
Console.WriteLine("Not in trade. Sleeping for 10 seconds.");
Thread.Sleep(10000);
}
然而,这会阻塞主线程并将其抛入一个紧密的循环中。当它醒来时,它会立即检查变量是否存在true
,如果不存在则让它重新进入睡眠状态。该HandleSteamMessage
函数没有时间Bot.cs
处理任何事情——即使机器人在睡眠时确实收到了一个事件。
我试过使用EventWaitHandle
,但似乎永远不会触发。
EventWaitHandle waitForInTrade = new EventWaitHandle(false, EventResetMode.AutoReset, "OnTradeRequest");
waitForInTrade.WaitOne(30000);
Console.WriteLine("In trade? " + inTrade.ToString());
这会将主线程暂停 30 秒(由于传入的超时WaitOne
),然后按预期继续。但是,inTrade
即使已收到交易请求,它仍然是错误的。由于那时我没有进行交易,因此后续代码将无效。
那么,处理此类交互的正确方法是什么?
我也将它交叉发布到/r/steambot subreddit。我希望这不是问题,特别是因为 Github 上的一些评论提到在此处发布以获得更好的帮助。