.NET fiber

Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

.NET fiber

Сообщение ANDLL » 06.09.2007 (Чт) 22:11

Если порыться в гугле то в основном находится попытки(насколько удачные - не знаю) создания сабжа с помощью CreateFiber и тому подобного.
На самом деле не самый удачный вариант, учитывая наличие класса CompressedStack
Честно говоря, гугл по фразе fiber CompressedStack нашел весьма мало вариантов. Интересно почему?
Ну раз уж гугл находит так мало, решил набросать вот свое:
Код: Выделить всё
Public Class Fiber
    <ThreadStatic()> Private Shared mCurrentFiber As Fiber

    Public Shared ReadOnly Property CurrentFiber() As Fiber
        Get
            Return mCurrentFiber
        End Get
    End Property

    Dim mProc As ParameterizedThreadStart
    Dim mState As Object
    Private Context As CompressedStack

    Sub New(ByVal nProc As ParameterizedThreadStart, ByVal nState As Object)
        mProc = nProc
        mState = nState
    End Sub

    Sub Switch()
        If CurrentFiber Is Nothing Then
            mCurrentFiber = Me
            mProc.Invoke(mState)
            mCurrentFiber = Nothing
        Else
            Dim nBegining As Fiber
            CurrentFiber.Context = CompressedStack.Capture
            nBegining = mCurrentFiber
            mCurrentFiber = Me
            If Context Is Nothing Then
                mProc.Invoke(mState)
            Else
                CompressedStack.Run(Context, New ContextCallback(AddressOf CtCallback), Me)
            End If
            mCurrentFiber = nBegining
        End If
    End Sub

    Sub CtCallback(ByVal s As Object)
        If TypeOf s Is Fiber Then
            'MsgBox("AAA")
        Else
            Throw New InvalidOperationException
        End If
    End Sub
End Class

Тестировать можно какнибудь так
Код: Выделить всё
Module Module1
    Dim f1 As New Fiber(New ParameterizedThreadStart(AddressOf Sub1), "A")
    Dim f2 As New Fiber(New ParameterizedThreadStart(AddressOf Sub1), "B")
    Dim f3 As New Fiber(New ParameterizedThreadStart(AddressOf Sub1), "C")

    Sub Main()
        f1.Switch()
        Console.ReadKey()
    End Sub


    Sub Sub1(ByVal s As Object)
        Console.WriteLine(s.ToString & "1")
        If Fiber.CurrentFiber Is f1 Then
            f2.Switch()
        ElseIf Fiber.CurrentFiber Is f2 Then
            f3.Switch()
        Else
            f1.Switch()
        End If
        Console.WriteLine(s.ToString & "2")
    End Sub
End Module
Если кому интересно, функциональность можно слегка расширить. Встрить там события или какойнить "шедулер"
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 09.09.2007 (Вс) 1:03

Напишешь статью?
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali


Вернуться в Народный треп

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 60

    TopList