【发布时间】:2023-04-04 11:43:01
【问题描述】:
我正在使用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 部分,我希望机器人在交易开始之前停止。然后,一旦启动,它就可以按预期继续并添加项目。
我尝试在OnTradeInit 函数中添加一个设置为true 的inTrade(初始化为false)变量,然后让机器人进入睡眠状态,直到这是真的。
while (!inTrade)
{
Console.WriteLine("Not in trade. Sleeping for 10 seconds.");
Thread.Sleep(10000);
}
然而,这会阻塞主线程并使其陷入紧密循环。当它醒来时,它会立即检查变量是否为true,如果不是则让它重新进入睡眠状态。 Bot.cs 中的 HandleSteamMessage 函数没有时间处理任何事情 - 即使机器人在睡眠时确实收到了事件。
我尝试使用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 上的一些 cmets 提到在这里发帖以获得更好的帮助。
【问题讨论】:
-
旁注:C# 中的约定是所有方法都以大写字母开头。以小写开头会让你的代码看起来非常业余。