我刚用这个纠正了一个bug:
_Thread.SetApartmentState(ApartmentState.STA);
Run Code Online (Sandbox Code Playgroud)
现在我想了解它的含义,以及它的工作原理!
我想要完成的是一个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)
尽管获取消息的速度更快,但是内存的使用可能会很高,我不想在将部署此解决方案的设备上引起任何问题。
有人可以帮我吗?我找不到实现这种目标的任何解决方法或方法。
谢谢!。
我正在这一页上学习 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) 这非常有效:
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)