小编Zer*_*ker的帖子

CancellationTokenSource,何时处置?

什么时候我应该处理CancellationTokenSource?如果我例如制作一个并且每次点击一个按钮就把它放在线程中:

    private void Button_Click(object sender, EventArgs e)
    {
        if (clicked == false)
        {

            clicked = true;
            CTSSend = new CancellationTokenSource();
            Thread1 = new Thread(() => Method1(CTSSend.Token)); 
            Thread1.Start();
            Thread2 = new Thread(() => Method2(CTSSend.Token)); 
            Thread2.Start();
        }
        else
        {
            CTSSend.Cancel();
            CTSSend.Dispose();
            clicked = false;
        }
    }
Run Code Online (Sandbox Code Playgroud)

我应该这样处理吗?因为如果是这样的话,它会有点问题,因为我需要把它放在Disposer中,当应用程序关闭时会将其处理掉,因为如果我不小心等待它,就不能保证它不会被处理掉,这将导致ObjectDisposedException.

我甚至试图用这个来防止异常(因为我不想使用Try Catch,我想在这种情况下首先得不到错误).

        if (CTSSend != null)
        {
            CTSSend.Cancel();
            CTSSend.Dispose();
        }
        if (CTSReceive != null)
        {
            CTSReceive.Cancel();
            CTSReceive.Dispose();
        }
Run Code Online (Sandbox Code Playgroud)

但是,也许我应该只处理它,并且每次取消后都不要处理它?虽然我不喜欢如何继续为新对象添加资源.

你们这些人如何处理这些案件?

编辑:

一个更具体的问题,将解决它(在我的情况下).

我如何将一个bool绑定到CancellationToken?所以我可以有类似CTS.IsDisposed的东西;

有些对象有,但CTS没有,如果有,它将解决我遇到的问题.我目前正在单独使用bool,这不是我喜欢的.

.net c# multithreading

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

大众处理,更好的方式?

因此,当我关闭表单时,我正在处理许多对象.即使它可能会自动处理它.但我仍然倾向于遵循处理中的"规则",希望它会坚持并帮助防止错误.

所以这就是我目前处理的方式,哪个有效.

        if (connect == true)
        {
            Waloop.Dispose();
            connect = false;
            UninitializeCall();
            DropCall();

        }
        if (KeySend.Checked || KeyReceive.Checked)
        {
            m_mouseListener.Dispose();
            k_listener.Dispose();

        }
        if (NAudio.Wave.AsioOut.isSupported())
        {
            Aut.Dispose();
        }

        if (Wasout != null)
        {
            Wasout.Dispose();
        }
        if (SendStream != null)
        {
            SendStream.Dispose();
        }
Run Code Online (Sandbox Code Playgroud)

所以基本上,首先是如果一个博尔是真的,意味着如果它不是那些可以被忽略,因为它们没有被我想到.

其他的只是让我处理的方法,如果在那里.但这不是一个非常好的方式,我希望它有一个大功能,意思.

处置,如果没有处置.或者其他的东西.我知道他们中的许多都有"被处置"的布尔,所以如果我可以检查每个对象,并且如果它是假的则应该可以处理.

c# dispose

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

如何判断流何时结束?

如何在不使用 BinaryWriter/Reader 的情况下将 TCP 流的大小嵌入或告知接收器?

必须有一种快速的方法让它知道它是否已经到达终点,当然,除了终止连接。

tcp.GetStream().Write(ms.GetBuffer(), 0, (int)ms.Length);
Run Code Online (Sandbox Code Playgroud)

我是这样发送的,但接收是困难的部分。

编辑:

这对我不起作用:

                while (tt1.GetStream().DataAvailable)
                {
                    su = Image.FromStream(tt1.GetStream());
                }
Run Code Online (Sandbox Code Playgroud)

c# tcp stream

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

Timespan计算差异

我有2个文本框,并想要计算那些之间的时间差异2.我得到它的工作,但它几乎没有,至少我认为我只是使它与一些"黑客".

如果某些东西不正确,它也会失败,并且会抛出异常,我想阻止它(可能有一个IF,如果它不正确则忽略它).

这是代码:

    private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            var first = TimeSpan.ParseExact(First.Text.Replace("-", ":").Remove(First.Text.LastIndexOf("-"), 1).Insert(First.Text.Length - 4, "."), "g", CultureInfo.InvariantCulture);
            var last = TimeSpan.ParseExact(Last.Text.Replace("-", ":").Remove(First.Text.LastIndexOf("-"), 1).Insert(First.Text.Length - 4, "."), "g", CultureInfo.InvariantCulture);
            var difference = first - last;
            CalcDiff.Text = difference.TotalSeconds.ToString("F3");
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,它有许多"替换"和各种各样的东西,只是为了使它工作.

我提供的格式是这样的:

2013-05-22 12-07-55-324

就此而言,我只关心时间,即:12-07-55-324

所以,我告诉它要替换 - 用,只是做它的工作,以及类似的东西.

那么,有没有办法改善这一点.我可以制作某种条件,所以我不能只按,按钮,如果不正确它会失败(例如格式错误,或者它没有任何内容,或者文字代替).

c#

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

Win32、WinMain 与自定义入口点(大小差异巨大),为什么?

正如主题所说。

我注意到,如果我使用 WinMain 或任何其他默认入口点,C 应用程序可能约为 70kb。

但如果我只是指定一个自定义入口点,比如“RawMain”,int RawMain()。那么文件大小大约是6kb。

所以我想知道为什么会这样,它添加/引用了文件什么?我可以理解尺寸上存在一些微小差异,但对于空应用程序来说差异巨大。

谢谢!

c winapi

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

背景计时器每秒,这是正确的方法吗?

我想每秒都来一个计时器.但我不想在UI线程上运行它,以防止冻结.

所以,我使用的是另一个计时器而不是Designer提供的内置计时器.而且我不确定这是否是正确的方法.

  threadtimer = new System.Threading.Timer(timer, null, 1000, Timeout.Infinite);
        private void timer(object obj)
        {
            dowork.....

            threadtimer.Change(1000, Timeout.Infinite);
        }
Run Code Online (Sandbox Code Playgroud)

它似乎是错的,我首先创建线程,并告诉它在1000之后运行,无限时间.而且我仍然需要复述它来永远这样做.如果它不成立,我为什么还要有第二个参数呢?

c# multithreading timer

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

计算时差,并使用天数

好吧,我有办法计算2个文件之间的时差,或者更确切地说是2个"日期".然而,如果时间差是一天,意味着一个开始,比如23:00,另一个01:20,那么它会失败并且认为它落后而不仅仅是2在前面的小时.

这是代码:

private void button1_Click(object sender, EventArgs e)
{
   try
   {
       DateTime firstDt;
       DateTime lastDt;
       if (DateTime.TryParseExact(First.Text, "yyyy-MM-dd HH-mm-ss-fff", CultureInfo.InvariantCulture, DateTimeStyles.None, out firstDt)
              && DateTime.TryParseExact(Last.Text, "yyyy-MM-dd HH-mm-ss-fff", CultureInfo.InvariantCulture, DateTimeStyles.None, out lastDt))
       {
          var difference = lastDt.TimeOfDay - firstDt.TimeOfDay;
          Console.WriteLine(difference);
          CalcDiff.Text = "DelayAudio(" + difference.TotalSeconds.ToString("F3") + ")";
       }
   }
   catch (Exception ex)
   {
      MessageBox.Show("TimeSpan Calculate: " + ex.Message);
   }
}
Run Code Online (Sandbox Code Playgroud)

不太确定如何让它使用Day,因为它似乎应该这样做.

c#

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

从C#运行命令

最糟糕的话题,但不能说更多。

问题是,我正在尝试从cmd运行某个命令,如果我在Windows中正常执行此命令,它是完美无缺的,在C#中,即使它是完全相同的字符串,也无法正常工作。

这是我的方法:

        Process cwebp = new Process();
        cwebp.StartInfo.FileName=("cmd.exe");
       cwebp.StartInfo.Arguments = Settings.EncoderSettings[0];
       cwebp.Start();
Run Code Online (Sandbox Code Playgroud)

好参数几乎是任何东西,例如:

opusenc --bitrate 100 input.wav output.opus

这里有什么基本问题吗?一直在搜索很多东西,找不到任何信息,所有内容都说(使用Arguments),我也这样做了,而且它没有按预期工作。

c#

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

标签 统计

c# ×7

multithreading ×2

.net ×1

c ×1

dispose ×1

stream ×1

tcp ×1

timer ×1

winapi ×1