什么时候我应该处理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,这不是我喜欢的.
因此,当我关闭表单时,我正在处理许多对象.即使它可能会自动处理它.但我仍然倾向于遵循处理中的"规则",希望它会坚持并帮助防止错误.
所以这就是我目前处理的方式,哪个有效.
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)
所以基本上,首先是如果一个博尔是真的,意味着如果它不是那些可以被忽略,因为它们没有被我想到.
其他的只是让我处理的方法,如果在那里.但这不是一个非常好的方式,我希望它有一个大功能,意思.
处置,如果没有处置.或者其他的东西.我知道他们中的许多都有"被处置"的布尔,所以如果我可以检查每个对象,并且如果它是假的则应该可以处理.
如何在不使用 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) 我有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
所以,我告诉它要替换 - 用,只是做它的工作,以及类似的东西.
那么,有没有办法改善这一点.我可以制作某种条件,所以我不能只按,按钮,如果不正确它会失败(例如格式错误,或者它没有任何内容,或者文字代替).
正如主题所说。
我注意到,如果我使用 WinMain 或任何其他默认入口点,C 应用程序可能约为 70kb。
但如果我只是指定一个自定义入口点,比如“RawMain”,int RawMain()。那么文件大小大约是6kb。
所以我想知道为什么会这样,它添加/引用了文件什么?我可以理解尺寸上存在一些微小差异,但对于空应用程序来说差异巨大。
谢谢!
我想每秒都来一个计时器.但我不想在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之后运行,无限时间.而且我仍然需要复述它来永远这样做.如果它不成立,我为什么还要有第二个参数呢?
好吧,我有办法计算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,因为它似乎应该这样做.
最糟糕的话题,但不能说更多。
问题是,我正在尝试从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),我也这样做了,而且它没有按预期工作。