相关疑难解决方法(0)

使用Thread.Abort()有什么问题

所以我知道你不应该使用

Thread.Abort()
Run Code Online (Sandbox Code Playgroud)

但我从未得到过很好的解释.是否存在性能损失或隐藏的问题?

我知道你不能忽略/吞下ThreadAbortException(这是有道理的)

.net c# multithreading

62
推荐指数
5
解决办法
3万
查看次数

如何在C#中立即杀死一个线程?

我正在使用该thread.Abort方法来杀死线程,但它不起作用.有没有其他方法来终止线程?

private void button1_Click(object sender, EventArgs e)
{
    if (Receiver.IsAlive == true)
    {
        MessageBox.Show("Alive");
        Receiver.Abort();
    }
    else
    {
        MessageBox.Show("Dead");
        Receiver.Start();
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用它,但每次我获得Alive状态,Receiver都是我的全局线程.

c# multithreading winforms

47
推荐指数
5
解决办法
18万
查看次数

如何有效地杀死C#中的线程?

我不是想给打一个死 马,诚实.我已经阅读了有关线程查杀的所有建议,但请考虑代码.它执行以下操作:

  1. 它启动一个线程(通过StartThread方法)
  2. 它调用数据库查找ServiceBroker队列中的任何内容.注意WAITFOR命令 - 这意味着它将一直坐在那里直到队列中有东西.这一切都在MonitorQueue方法中.
  3. 杀死线程.我试过.Interrupt- 似乎什么也没做.然后我尝试了.Abort,永远不应该使用,但即使这样做也没有.

    Thread thxMonitor = new Thread(MonitorQueue);
    void StartThread() {
        thxMonitor.Start();
    }
    
    void MonitorQueue(object obj) {
        var conn = new SqlConnection(connString);
        conn.Open();
        var cmd = conn.CreateCommand();
        cmd.CommandTimeout = 0; // forever and ever
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = "WAITFOR (RECEIVE CONVERT(int, message_body) AS Message FROM SBQ)";
    
        var dataTable = new DataTable();
        var da = new SqlDataAdapter(command); …
    Run Code Online (Sandbox Code Playgroud)

.net c# multithreading .net-3.5

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

在C#中的循环中使用lock语句

让我们尝试使用示例类SomeThread,我们试图阻止在Running属性设置为false之后调用DoSomething方法,并且由OtherThread类调用Dispose,因为如果在Dispose方法之后调用它们,则世界将以我们结束知道.

感觉因为循环,有可能发生邪恶的事情.在调用DoSomething方法之前,在启动下一个循环和锁定之前,可以将Running更改为false,并在它到达锁定之前调用Disposed.在这种情况下,生活不会很好.

当我在一个简单易于维护的方法中使用循环时,我正在研究如何处理这个问题.为了记录,我确实考虑过Double Lock Check图案,但它似乎并不适合C#.

警告:这是一个简化的示例,试图让您更容易关注循环和锁定问题.如果我没有详细说明某些地方请告诉我,我会尽力填写任何细节.

public class SomeThread : IDisposable
{
    private object locker = new object();
    private bool running = false;

    public bool Running 
    { 
        get
        {
            lock(locker)
            {
                return running;
            }
        }
        set
        {
            lock(locker)
            {
                running = value;
            }
        }
    }

    public void Run()
    {
        while (Running)
        {
            lock(locker)
            {
                DoSomething1();
                DoSomething2();
            }
        }
    }

    private void DoSomething1()
    {
        // something awesome happens here
    }

    private void DoSomething2()
    {
        // something more awesome happens here …
Run Code Online (Sandbox Code Playgroud)

c# multithreading loops locking

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

捕获ThreadAbortException并且不执行任何操作是否有意义?

catch (ThreadAbortException)
{ }
catch (Exception ex)
{
    TraceManager.TraceException(ex,
                                (int)ErrorCode.GENERIC_EXCEPTION,
                                ex.StackTrace + "\n" + ex.Message + "\n" + VendorUrl);
}
Run Code Online (Sandbox Code Playgroud)

甚至拥有它是否有意义

catch (ThreadAbortException)
{ }
Run Code Online (Sandbox Code Playgroud)

还是会导致ThreadAbortException被吞噬和永远丢失?

.net exception-handling

11
推荐指数
2
解决办法
7909
查看次数

如何终止在非托管代码中阻止的托管线程?

我有一个在等待,阻塞,在非托管代码托管的线程(具体地说,到NamedPipeServerStream.WaitForConnection()的调用ultimitely非托管代码,并没有一个电话不提供超时).

我想整齐地关闭线程.

Thread.Abort()在代码返回托管领域之前没有任何效果,在客户端建立连接之前它不会这样做,我们不能等待.

我需要一种从非托管代码中"震惊"的方法; 或者即使它处于未管理的土地上也只是杀死线程的方法.

.net c# multithreading

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

使用另一个线程停止一个线程的工作

不确定我的标题是否措辞得当,但无论如何:)

我有两个线程:包含需要完成的工作的主线程,以及包含带有进度条和取消按钮的表单的工作线程。在正常代码中,情况正好相反,但在这种情况下我不能这样做。

当用户单击取消按钮时,会显示一条提示,询问他是否真的要取消该工作。问题是工作在主线程上继续进行。我可以让主线程停止工作等,但我希望当他在提示上单击“是”时它停止工作。

例子:

// Main thread work starts here    
    t1 = new Thread(new ThreadStart(progressForm_Start));
    t1.Start();

    // Working
    for (i = 0; i <= 10000; i++)
    {
        semaphore.WaitOne();
        if (pBar.Running)
            bgworker_ProgressChanged(i);
        semaphore.Release();
        if (pBar.IsCancelled) break; 
    }

    t1.Abort(); 
// Main thread work ends here

// Start progress bar form in another thread
void progressForm_Start()
{
    pBar.Status("Starting");
    pBar.ShowDialog();
}
Run Code Online (Sandbox Code Playgroud)

理论上我可以在 cancelWatch() 函数中包含一个提示,但随后我必须在实现此类的所有地方都这样做。

c# multithreading

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

如何使用带有CancellationToken的Task包装单个同步操作?

我只有一个同步操作,可能需要很多时间才能完成。该操作的调用者提供了一个CancellationToken符号,并且在令牌被取消后,该操作应立即停止(在这种情况下,取消后的几毫秒内也将起作用)。

如何将其包装在带有CancellationToken的任务中?

我无法更改调用代码或调用本身。

曾经是: LongOperation();

我现在所拥有的: await Task.Run(() => LongOperation(), cancellationToken).ConfigureAwait(false);

显然,这是行不通的,因为您必须在给的操作中轮询令牌Task.Run。

.net c# async-await

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