小编Mic*_*kus的帖子

您可以在代码中配置log4net而不是使用配置文件吗?

我理解为什么log4net使用app.config文件来设置日志记录 - 这样您就可以轻松更改信息的记录方式,而无需重新编译代码.但在我的情况下,我不想app.config用我的可执行文件打包文件.我不想修改我的日志记录设置.

有没有办法让我设置登录代码而不是使用app.config

这是我的简单配置文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <log4net>
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="Logs\EventLog.txt" />
      <appendToFile value="false" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="5" />
      <maximumFileSize value="1GB" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
      </layout>
    </appender>
    <appender name="MemoryAppender" type="log4net.Appender.MemoryAppender">
    </appender>
    <root>
      <level value="Info" />
      <appender-ref ref="RollingLogFileAppender" />
      <appender-ref ref="MemoryAppender" />
    </root>
  </log4net>
</configuration>
Run Code Online (Sandbox Code Playgroud)

编辑:

要完全清楚:我的目标是没有XML文件.甚至不是我变成流的嵌入式资源.我的目标是完全以编程方式定义记录器.只是好奇是否有可能,如果是这样,我可能会找到一个语法示例.

.net c# logging log4net

129
推荐指数
4
解决办法
8万
查看次数

正确的.NET方式来实现单个实例应用程序

我已经在StackOverflow上看到至少三种不同的方法来实现这一目标.

  1. 使用MUTEX:接受此SO问题的答案

  2. 使用Microsoft.VisualBasic库的WindowsFormsApplicationBase:对此SO问题的第二高投票答案

  3. 使用Process.GetProcessNames检查您的应用程序是否正在运行:此处的方法是作为此SO问题的答案发布的

我相信还有更多方法可以做到这一点.

我只是想知道其中一个是否是首选的,如果我选择"错误的",可能会产生什么后果.

.net c# single-instance

17
推荐指数
2
解决办法
1万
查看次数

如何生成"人类可读"的字符串来表示TimeSpan

我有一个TimeSpan代表客户端连接到我的服务器的时间.我想将其显示TimeSpan给用户.但我不想过于冗长地显示那些信息(例如:2小时3分钟32.2345秒=太详细了!)

例如:如果连接时间是......

> 0 seconds and < 1 minute   ----->  0 Seconds
> 1 minute  and < 1 hour     ----->  0 Minutes, 0 Seconds
> 1 hour    and < 1 day      ----->  0 Hours, 0 Minutes
> 1 day                      ----->  0 Days, 0 Hours
Run Code Online (Sandbox Code Playgroud)

当然,在数字为1(例如:1秒,1分钟,1小时,1天)的情况下,我想使文本单数(例如:1秒,1分钟,1小时,1天) .

无论如何,如果没有一组巨大的if/else子句,可以轻松实现吗?这是我目前正在做的事情.

public string GetReadableTimeSpan(TimeSpan value)
{
    string duration;

    if (value.TotalMinutes < 1)
        duration = value.Seconds + " Seconds";
    else if (value.TotalHours < 1)
        duration = value.Minutes + " Minutes, " …
Run Code Online (Sandbox Code Playgroud)

.net c# timespan string-formatting

17
推荐指数
5
解决办法
9716
查看次数

使用给定的步数获取给定最小值和最大值的可枚举范围

我熟悉用于生成值枚举的Enumerable.Range方法.但我想略有不同.我想提供最小值,最大值和一些所需的点.

IE:

Method(double min, double max, int numberOfSteps)

服用

Method(0, 1000, 11);

会回来的

0, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000

我认为这样的事情,必须有一个内置的方法,但我的搜索没有任何改变.我错过了什么吗?

c# range winforms

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

ContextMenuStrip.Owner属性null从嵌套ToolStripMenuItem检索时

我有ContextMenuStrip两个ToolStripItems 的设置.第二个ToolStripItem有两个额外的嵌套ToolStripItems.我将其定义为:

ContextMenuStrip cms = new ContextMenuStrip();
ToolStripMenuItem contextJumpTo = new ToolStripMenuItem();
ToolStripMenuItem contextJumpToHeatmap = new ToolStripMenuItem();
ToolStripMenuItem contextJumpToHeatmapStart = new ToolStripMenuItem();
ToolStripMenuItem contextJumpToHeatmapLast = new ToolStripMenuItem();

cms.Items.AddRange(new ToolStripItem[] { contextJumpTo,
                                         contextJumpToHeatmap});
cms.Size = new System.Drawing.Size(176, 148);

contextJumpTo.Size = new System.Drawing.Size(175, 22);
contextJumpTo.Text = "Jump To (No Heatmapping)";

contextJumpToHeatmap.Size = new System.Drawing.Size(175, 22);
contextJumpToHeatmap.Text = "Jump To (With Heatmapping)";
contextJumpToHeatmap.DropDownItems.AddRange(new ToolStripItem[] { contextJumpToHeatmapStart, 
                                                                  contextJumpToHeatmapLast });

contextJumpToHeatmapStart.Size = new System.Drawing.Size(165, 22);
contextJumpToHeatmapStart.Text = …
Run Code Online (Sandbox Code Playgroud)

.net c# contextmenustrip winforms

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

第一次显示控件后会立即发生什么事件?

我知道有UserControl.Load,这是在控件第一次出现之前发生的.而且我知道UserControl.HandleCreated,当为控件创建句柄时会发生这种情况.

但我正在寻找第一次实际显示控件时发生的事件.

原因:

我正在处理一个DataGridView在显示控件之前放入一堆数据的数据.我不能在BackColor没有绘制控件的情况下为rows()着色(命令根本不起作用).只有在第一次绘制控件时,才会使用颜色行的命令.所以我需要捕获该事件并在该点着色行.

dataGridView1.Rows[index].DefaultCellStyle.BackColor = Color.Red;
Run Code Online (Sandbox Code Playgroud)

上面的行在显示控件时起作用,但是在控件未显示的情况下不起作用.

.net c# events user-controls winforms

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

获取/设置RichTextBox的第一个可见行

我有一个RichTextBox包含数千行文字的文章.通过做... 我可以很容易地SET通过使用第一条可见线ScrollToCaret()

this.SelectionStart = this.Find(this.Lines[lineIndex], RichTextBoxFinds.NoHighlight);
this.ScrollToCaret();
Run Code Online (Sandbox Code Playgroud)

但我希望能够GET成为第一条可见线.有什么建议?

.net c# scroll richtextbox winforms

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

从输入到扬声器的音频硬件传递 - 不是用软件完成的

几年前,我为我的公司编写了一个自定义应用程序,该应用程序只运行一台特定型号的计算机.应用程序必须能够将麦克风插孔中的音频传递到扬声器.我没有处理进入插孔并通过软件传递给扬声器的字节,而是说明了我知道特定的硬件来编写一个功能,该功能使声卡的内置功能能够将音频从输入循环到扬声器.这是该函数(它是用C语言编写的,仅使用mmsystem.dll):

int setMasterLevelsFromMicrophone (int volume, int mute)
{
    MMRESULT error;

    // Open the mixer
    HMIXER mixerHandle;
    if (error = mixerOpen (&mixerHandle, 0, 0, 0, 0))
        return 1;

    // Get the microphone source information
    MIXERLINE mixerline;
    mixerline.cbStruct = sizeof(MIXERLINE);
    mixerline.dwDestination = 0;
    if ((error = mixerGetLineInfo((HMIXEROBJ)mixerHandle, &mixerline, MIXER_GETLINEINFOF_DESTINATION)))
        return 2;

    // Get the microhone source controls
    MIXERCONTROL mixerControlArray[2];
    MIXERLINECONTROLS mixerLineControls;
    mixerLineControls.cbStruct = sizeof(MIXERLINECONTROLS);
    mixerLineControls.cControls = 2;
    mixerLineControls.dwLineID = mixerline.dwLineID;
    mixerLineControls.pamxctrl = &mixerControlArray[0];
    mixerLineControls.cbmxctrl = sizeof(MIXERCONTROL);

    if ((error = mixerGetLineControls((HMIXEROBJ)mixerHandle, &mixerLineControls, MIXER_GETLINECONTROLSF_ALL))) …
Run Code Online (Sandbox Code Playgroud)

c# hardware audio winforms

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

如何在C#中长时间调用.Distinct()报告进度

我有一个名为的自定义对象数组AnalysisResult.该数组可以包含数十万个对象; 并且,偶尔我只需要Distinct()该数组的元素.所以,我写了一个调用的项比较器类,AnalysisResultDistinctItemComparer并按我这样的方式调用:

public static AnalysisResult[] GetDistinct(AnalysisResult[] results)
{
    return results.Distinct(new AnalysisResultDistinctItemComparer()).ToArray();
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,当数组特别大(大于200,000个对象)时,此调用可能需要很长时间(大约几分钟).

我目前在后台工作程序中调用该方法并显示一个旋转gif,以警告用户该方法正在执行,并且应用程序尚未冻结.这一切都很好,但它没有给用户任何当前进展的指示.

我真的需要能够向用户指出此动作的当前进度; 但是,我一直无法想出一个好方法.我正在玩这样的事情:

public static AnalysisResult[] GetDistinct(AnalysisResult[] results)
{
    var query = results.Distinct(new AnalysisResultDistinctItemComparer());

    List<AnalysisResult> retVal = new List<AnalysisResult>();
    foreach(AnalysisResult ar in query)
    {
        // Show progress here
        retVal.Add(ar);
    }

    return retVal.ToArray();
}
Run Code Online (Sandbox Code Playgroud)

但问题是我无法知道我的实际进展是什么.思考?建议?

.net c# linq progress distinct

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

如何使用一系列元素作为目标正确搜索和解析数组

我有一个字节数组,看起来像这样:

byte[] exampleArray = new byte[] 
                      { 0x01, 0x13, 0x10, 0xe2, 0xb9, 0x13, 0x10, 0x75, 0x3a, 0x13 };
Run Code Online (Sandbox Code Playgroud)

我的最终目标是在看到序列的任何时候将这个数组拆分成子数组{ 0x13, 0x10 }.所以我在示例数组上的期望结果将是:

{ 0x01 }
{ 0xe2, 0xb9 }
{ 0x75, 0x3a, 0x13 }
Run Code Online (Sandbox Code Playgroud)

理想情况下,我还需要知道最终数组{ 0x75, 0x3a, 0x13 }并没有以搜索顺序结束,因此我可以将其作为一个特例来处理.

有关最佳方法的任何想法?

.net c# arrays parsing

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