簡體   English   中英

Spinwait用於可移植類庫中的許多旋轉

[英]Spinwait for a number of spins in Portable Class Library

我想通過Xamarin替換面向ASPNET Core,.NET 4.5.2和Android + iOS的PCL中的SpinWait方法,但找不到直接的等效方法。 目前我正在考慮更換

System.Threading.Thread.SpinWait(10);

SpinWait spinWait = new SpinWait();
SpinWait.SpinUntil(() => spinWait.Count >= 10);

但是我不知道我是不是開了一罐蠕蟲。 或者如果可能

for(int i=0; i<10; i++) SpinOnce();

更好。 我已經避免了這一點,因為SpinOnce()在每次旋轉后都會產生,因此效率可能會降低。

語境:

我目前正在將這個高精度計時器移植到PCL(ASPNET Core,.NET 4.5.2和Android + iOS,通過Xamarin),並遇到SpinWait方法刪除問題。 http://www.codeproject.com/Articles/98346/Microsecond-and-Millisecond-NET-Timer

在.NET Framework中,有一個方法SpinWait()接受一個int,它指示要等待多少個旋轉( https://msdn.microsoft.com/en-us/library/system.threading.thread.spinwait( v = vs.110).aspx )但是當針對這個框架組合但是包含SpinWait結構時,System.Threading.Thread命名空間不可用( https://msdn.microsoft.com/en-us/library/ system.threading.spinwait(v = vs.110).aspx )它允許我訪問SpinOnce()和一個接受布爾返回函數的SpinUntil()方法。

原來我對避免屈服的直覺並不完全正確,並且發現在SpinUntil( http://referencesource.microsoft.com/#mscorlib/system/threading/SpinWait.cs )的源代碼中,實際上有一次對SpinOnce的重復調用()。

沒有錯誤檢查邏輯,它看起來像這樣:

//Error Checking Logic
SpinWait spinner = new SpinWait();
        while (!condition())
        {
            //Timeout checks
            spinner.SpinOnce();
            //Timeout and Yielding checks
            }
        }
//Return Logic

因此,我將此視為可接受的實現示例,並將使用(除非更好的解決方案本身)類似於下面的內容來重新創建所需的行為。

SpinWait spinner = new SpinWait();
    while (spinner.Count<10)
    {
        spinner.SpinOnce();
        //Timeout and Yielding checks
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM