相关疑难解决方法(0)

ApartmentState for dummies

我刚用这个纠正了一个bug:

_Thread.SetApartmentState(ApartmentState.STA);
Run Code Online (Sandbox Code Playgroud)

现在我想了解它的含义,以及它的工作原理!

.net multithreading

111
推荐指数
1
解决办法
3万
查看次数

快速高效地读取Windows日志

我想要完成的是一个C#应用程序,它将从Windows事件日志中读取日志并将它们存储在其他位置。这必须很快,因为将要安装它的某些设备会生成大量的日志/秒。

到目前为止,我已经尝试了三种方法:

本地WMI:效果不好,有太多错误和异常,这些异常和异常是由需要加载的集合的大小引起的。EventLogReader:我虽然这是一个完美的解决方案,但是它允许您使用XPath表达式查询事件日志。问题是,当您想获取每个日志的消息内容时(通过调用FormatDescription()),对于长集合来说会花费太多时间。例如:如果我浏览它们,我可以在0.11s内读取12k日志。如果我添加一行来为每个日志存储消息,那么将花费近6分钟的时间来完成完全相同的操作,这对于如此低的日志数量是完全疯狂的。我不知道是否可以对EventLogReader进行某种优化以更快地获取消息,我无法

我还发现,您可以使用名为EventLog的类读取日志条目。但是,该技术不允许您输入任何类型的过滤器,因此您基本上必须将整个日志列表加载到内存中,然后根据需要将其过滤掉。这是一个例子:

EventLog eventLog = EventLog.GetEventLogs().FirstOrDefault(el => el.Log.Equals("Security", StringComparison.OrdinalIgnoreCase));
var newEntries = (from entry in eventLog.Entries.OfType()
orderby entry.TimeWritten ascending
where entry.TimeWritten > takefrom
select entry);
Run Code Online (Sandbox Code Playgroud)

尽管获取消息的速度更快,但是内存的使用可能会很高,我不想在将部署此解决方案的设备上引起任何问题。

有人可以帮我吗?我找不到实现这种目标的任何解决方法或方法。

谢谢!。

c# windows logging

6
推荐指数
2
解决办法
540
查看次数

关于 Task.StartNew(Action<Object>, Object) 方法

我正在这一页上学习 TPL,有一个代码块让我很困惑。

我正在阅读此页:任务并行性(任务并行库)

在一节中,它说以下代码是正确的解决方案,因为循环中的 lambda 无法获取每次迭代后都会发生变化的值,而是获取最终值。因此,您应该将“i”包装在 CustomData 对象中。代码如下:

class CustomData
{
   public long CreationTime;
   public int Name; 
   public int ThreadNum;
}

public class Example
{
   public static void Main()
   {
      // Create the task object by using an Action(Of Object) to pass in custom data 
      // to the Task constructor. This is useful when you need to capture outer variables 
      // from within a loop. 
      Task[] taskArray = new Task[10];
      for (int i = 0; i < taskArray.Length; i++) …
Run Code Online (Sandbox Code Playgroud)

.net c# multithreading task task-parallel-library

3
推荐指数
1
解决办法
4499
查看次数

具有输入参数和输出的Task.Run

这非常有效:

private void MainMethod()
{
    Task<bool> taskItemFound = new Task<bool>(ItemFound);
}

private bool ItemFound()
{
    //Do Work
    return true;
}
Run Code Online (Sandbox Code Playgroud)

这有效,但是UGLY,我不能传递多个参数:

private void MainMethod()
{
    var startNew = Task<bool>.Factory.StartNew(TempMethod, "cow");
}

private bool TempMethod(object o)
{
    return ("holy " + o == "holy cow");
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找一个解决方案,它将Task<bool>从一个带有多个输入参数的现有方法中获得一个并返回一个bool.理想情况下,它看起来像这样:

Task<bool> taskItemFound = new Task<bool>(ItemFound(param1, param2, param3));
Run Code Online (Sandbox Code Playgroud)

c# task task-parallel-library

1
推荐指数
1
解决办法
1855
查看次数