Visual Studio 使用SQL XEvents QueryableXEventData进行无限迭代

wd2eg0qa  于 2023-10-23  发布在  其他
关注(0)|答案(1)|浏览(155)

请求是:使用来自SQL的XEvents API,我必须提取和分析事件日志。我已经个性化了这个会话“QuickSessionTSQL”,使它只记录过程或查询。下面的代码运行得很好,除了一旦它进入第一个foreach块,它就永远不会离开,它只是在等待事件的到来,即使没有其他事件可以触发。它创造了一个无限循环…
如果我执行一个SQL查询,那么它会生成一个事件,foreach将真实的处理该事件。
我试图打破它,但我找不到一个合适的解决方案。
以前有人处理过这个吗?

  1. //Connection string
  2. SqlConnectionStringBuilder csb = new SqlConnectionStringBuilder();
  3. csb.DataSource = @"DESKTOP-85BSKEM\MSSQLSERVER2016";
  4. csb.InitialCatalog = @"master";
  5. csb.IntegratedSecurity = true;
  6. //Session name
  7. string sessionName = "QuickSessionTSQL";
  8. SqlConnection sqlConnection = new SqlConnection(csb.ConnectionString);
  9. SqlStoreConnection connection = new SqlStoreConnection(sqlConnection);
  10. BaseXEStore store = new XEStore(connection);
  11. Session s = store.CreateSession(sessionName);
  12. s.Start();
  13. QueryableXEventData xEvents = new QueryableXEventData(csb.ConnectionString, sessionName, EventStreamSourceOptions.EventStream, EventStreamCacheOptions.DoNotCache);
  14. foreach (var evt in xEvents)
  15. {
  16. foreach (PublishedEventField fld in evt.Fields)
  17. {
  18. string fieldName = fld.Name;
  19. string fieldValue = fld.Value.ToString();
  20. Debug.WriteLine(fieldName + " " + fieldValue);
  21. }
  22. }
vzgqcmou

vzgqcmou1#

为此选择IELTS有一些缺点。它是所有集合的基类型,并使您可以使用LINQ访问流。但要结束有点尴尬。
无论如何,我认为这种模式应该类似于在后台线程上枚举集合,并在希望枚举终止时从前台线程发出信号。就像这样:

  1. var xEvents = new QueryableXEventData(csb.ConnectionString, sessionName, EventStreamSourceOptions.EventStream, EventStreamCacheOptions.DoNotCache);
  2. var cancellationTokenSource = new CancellationTokenSource();
  3. var reader = Task.Factory.StartNew((o) =>
  4. {
  5. foreach (var evt in xEvents)
  6. {
  7. foreach (PublishedEventField fld in evt.Fields)
  8. {
  9. string fieldName = fld.Name;
  10. string fieldValue = fld.Value.ToString();
  11. Console.WriteLine(fieldName + " " + fieldValue);
  12. }
  13. }
  14. }, TaskCreationOptions.LongRunning
  15. , cancellationTokenSource.Token);
  16. Console.WriteLine("Hit any key to exit");
  17. Console.ReadKey();
  18. cancellationTokenSource.Cancel();
  19. xEvents.Dispose();
  20. s.Stop();
  21. reader.Wait();
展开查看全部

相关问题