Multithreading 并发web请求在单元测试中工作,但从表单运行时超时?
我在这里使用这个库:用于对新Betfair API的并发web请求。在我实现一个表单来运行所有东西之前,我使用单元测试开发了很多代码 下面的代码来自给定的示例,对我来说,当我从单元测试运行它时,它将运行,但当我从窗体(使用按钮单击)运行它时,它将失败 当我从按钮上运行它时,它将正确登录,但将在“ListCurrencyRates”上超时,该请求将在单元测试中顺利通过Multithreading 并发web请求在单元测试中工作,但从表单运行时超时?,multithreading,unit-testing,system.reactive,betfair,Multithreading,Unit Testing,System.reactive,Betfair,我在这里使用这个库:用于对新Betfair API的并发web请求。在我实现一个表单来运行所有东西之前,我使用单元测试开发了很多代码 下面的代码来自给定的示例,对我来说,当我从单元测试运行它时,它将运行,但当我从窗体(使用按钮单击)运行它时,它将失败 当我从按钮上运行它时,它将正确登录,但将在“ListCurrencyRates”上超时,该请求将在单元测试中顺利通过 BetfairClient Client = new BetfairClient(Exchange.UK, "appKey");
BetfairClient Client = new BetfairClient(Exchange.UK, "appKey");
MarketListener MarketListener = MarketListener.Create(Client, BFHelpers.HorseRacePriceProjection(), 1);
Client.Login("certificate", "certpass", "betfairUsername", "betfairPassword");
//*** times out here!!!!
var currencyRates = Client.ListCurrencyRates("GBP").Result;
我没有任何错误,我让它运行了30分钟,它没有抛出错误。当我暂停操作时,它只是说“这是线程从当前函数返回时将运行的下一条语句”
有人对为什么会发生这种情况有什么建议吗
非常感谢您的帮助
更新
在从单元测试调用ListCurrencyRates之前,以下线程正在运行
Not Flagged 9420 1 Main Thread Main Thread System.Threading.WaitHandle.WaitAny() Normal
Not Flagged 12752 0 Worker Thread <No Name> Normal
Not Flagged 3792 5 Worker Thread <No Name> Normal
Not Flagged 7436 9 Worker Thread <No Name> Normal
Not Flagged 14396 0 Worker Thread <No Name> Normal
Not Flagged 14340 10 Worker Thread <No Name> Normal
Not Flagged 11268 11 Worker Thread <No Name> Normal
Not Flagged 14420 12 Worker Thread <No Name> System.Threading.Thread.Join() Normal
Not Flagged 14532 14 Worker Thread <No Name> System.Threading.WaitHandle.WaitAny() Normal
Not Flagged 13448 15 Worker Thread <No Name> Normal
Not Flagged 14564 17 Worker Thread <No Name> Normal
Not Flagged 14032 0 Worker Thread <No Name> Highest
Not Flagged 14356 16 Worker Thread Worker Thread BetfairNG.MarketListener.PollMarketBooks.AnonymousMethod__18 Normal
Not Flagged 14788 19 Worker Thread EventPumpThread System.Threading.Monitor.Wait() Highest
Not Flagged > 14800 20 Worker Thread TestRunnerThread Core.Trader.GetMarkets Normal
Not Flagged 15104 21 Worker Thread <No Name> System.Threading.WaitHandle.WaitAny() Normal
未标记9420 1主线程主线程系统。Threading.WaitHandle.WaitAny()正常
未标记12752 0工作线程正常
未标记3792 5工作线程正常
未标记7436 9工作线程正常
未标记14396 0工作线程正常
未标记14340 10工作线程正常
未标记11268 11工作线程正常
未标记14420 12工作线程系统。线程。线程。连接()正常
未标记14532 14工作线程系统。线程。WaitHandle.WaitAny()正常
未标记13448 15工作线程正常
未标记14564 17工作线程正常
未标记14032 0工作线程最高
未标记14356 16工作线程工作线程BetfairNG.MarketListener.PollMarketBooks.AnonymousMethod_uu18正常
未标记14788 19工作线程EventPumpThread System.Threading.Monitor.Wait()最高
未标记>14800 20工作线程TestRunnerThread Core.Trader.GetMarkets Normal
未标记15104 21工作线程系统。Threading.WaitHandle.WaitAny()正常
当我按下表单中的按钮运行时,它们在同一点运行:
Not Flagged 0 0 Unknown Thread [Thread Destroyed]
Not Flagged 15340 0 Worker Thread <No Name> Highest
Not Flagged 11716 3 Worker Thread <No Name> Normal
Not Flagged 14448 8 Worker Thread vshost.RunParkingWindow [Managed to Native Transition] Normal
Not Flagged 15344 7 Worker Thread <No Name> Normal
Not Flagged 14656 10 Worker Thread .NET SystemEvents [Managed to Native Transition] Normal
Not Flagged > 15016 11 Main Thread Main Thread Core.Trader.GetMarkets Normal
Not Flagged 14512 6 Worker Thread <No Name> Normal
Not Flagged 9272 12 Worker Thread Worker Thread BetfairNG.MarketListener.PollMarketBooks.AnonymousMethod__18 Normal
Not Flagged 3588 0 Worker Thread <No Name> Normal
Not Flagged 13656 14 Worker Thread <No Name> System.Threading.WaitHandle.WaitAny() Normal
未标记0未知线程[线程已销毁]
未标记15340 0工作线程最高
未标记11716 3工作线程正常
未标记14448 8工作线程vshost.RunParkingWindow[管理到本机转换]正常
未标记15344 7工作线程正常
未标记14656 10工作线程.NET SystemEvents[管理到本机转换]正常
未标记>15016 11 Main Thread Main Thread Core.Trader.GetMarkets Normal
未标记14512 6工作线程正常
未标记9272 12工作线程工作线程BetfairNG.MarketListener.PollMarketBooks.AnonymousMethod__18正常
未标记的3588 0工作线程正常
未标记13656 14工作线程系统。Threading.WaitHandle.WaitAny()正常
显然缺少了一些,这可能是问题的根源吗?我无法对线程比较发表评论,但注意到Pobar的示例是一个控制台应用程序,它与测试运行程序一样,在MTA线程上执行。而表单(WinForms和WPF)始终是STA线程。也许可以尝试在线程池线程上执行您的代码,因为这些线程总是MTA?@groverboy这是解决方案,我通过从BackgroundWorker运行它解决了问题(我查到它是MTA线程)。你想把这个作为答案提交给我,我会给你最好的答案吗?我不知道如何在这个问题上进行PM,与我开始对话,我会帮你解决:)没关系,这似乎不值得努力。我已经开始删除这些注释,以清理这部分知识库:)