如何在C#里結束一個無限循環線程?

經建議,更改了一下問題描述

Abort()方法自然是不行,而且意外的是isBackground=true也不行。

主進程是一個用C#寫的界面式的遊戲修改器,而欲結束的線程所包含的函數,是用C++寫在dll里然後在C#里調用的,而這個dll里的函數,包含了若干個無限循環的子函數,對,沒錯,無限循環的不是被C#調用的函數,而是其所包含的子函數,而且這些子函數在dll里也是用的多線程執行的(我當時真是瘋了)

綜上所述,要是想傳一個停止條件的參數得傳到姥姥家去。

所以,我的預想是在C# WinForm里直接調用一個方法kill掉這個線程並且不影響其他線程的運行(方便後期添加功能)

第二次補充完上述問題描述,我覺得我tm還是重構吧(汗)


用Task,然後你就會在參數裡面拿到一個CancellationToken,每次循環的時候看一下這個類,就知道外面有沒有人要你結束了,然後優雅地結束。

調用這個Task很簡單,new一個CalcellationToken進去,然後在你想結束的時候設置一下屬性。

Thread的話可以改一改,用volatile bool類型的變數,每次循環的時候讀一下,想辦法讓外面可以改。


……你還是沒有說清楚。

我猜你的問題是這樣的:你寫了個dll供C#調用,導出的某個函數提供的功能是創建幾個無限循環的線程,現在你需要一個途徑通過C#來結束掉這些線程。

張順泓:如何在C#里結束一個無限循環線程?這個答案是OK的,弄幾個全局的bool變數直接在子函數里判斷,導出幾個用來控制用的函數就OK了,沒什麼不好傳遞的,甚至你可以直接把那幾個變數的指針暴露出來,從C#裡面修改。

===============================

根據我個人的經驗,對修改器而言幾乎沒有使用C++的dll的必要,除非你需要驅動級別的訪問、D3DHook、或者實現要針對U3D遊戲實現某些操作,又或者非常騷包的想在遊戲里注入一個自己的修改器窗口……

而多線程則更加沒必要了。我猜你那些無限循環的函數作用是讀取或者鎖定某些數值,如果我猜對了,那麼相信我,這些東西在Forms.Timer中處理毫無壓力,對修改器而言沒有必要創建一個額外的線程,消息循環和UI線程沒那麼脆弱。而如果是鎖定某些數值的話,你可以採用彙編的方式去修改,壓力更小。


弄個全局變數

public bool ContinueFuck = true

在具體的循環處弄個判斷

while(ContinueFuck){

//TODO

}

這樣每次循環都會檢查是否還需要繼續循環。

如果外部將ContinueFuck設為FALSE,那麼下次循環就不會發生了


哪有那麼麻煩?一堆大牛回答的亂七八糟的

直接在循環後面加一個 bool判定不就行了

C#中 bool只有對錯一次判定,無限循環函數給一個條件判定強制結束就ok了

bool fuck = false;

Public void fucku()

{

If(fuck == false)

fuck == true;

}

手機打的沒有tab,自己修正


推薦閱讀:

TAG:C編程語言 | CC | C多線程 | Winform |