WebSite <STAThread()>
От: Monstrik  
Дата: 02.08.07 07:20
Оценка:
Web приложение

в Модуле есть функция которая пишет лог с флагом <STAThread()>

 <STAThread()> _
    Public Sub Write2CacheLog(ByVal ParamArray Scores() As String)

        Dim I As Integer
        Dim WriteTo As String = ConfigurationManager.AppSettings("CacheLogPath")

        If WriteTo = "" Then
            WriteTo = AppDomain.CurrentDomain.BaseDirectory
        End If


        Dim oWrite As New System.IO.StreamWriter(WriteTo & Now.ToString("yyyy-MM-dd") & "-Cache.log", True)

        oWrite.Write(Now.ToString("HH:mm:ss") & vbTab)
        For I = 0 To UBound(Scores)
            oWrite.Write(Scores(I) & vbTab)
        Next I

        oWrite.Write(vbNewLine)
        oWrite.Close()

    End Sub




Как это работает почему и в чем отличие
ето отделный сред или как
Re: WebSite <STAThread()>
От: Овощ http://www.google.com
Дата: 02.08.07 07:27
Оценка:
Здравствуйте, Monstrik, Вы писали:

В msdn про этот атрибут пишут следующее: Apply this attribute to the entry point method (the Main() method in C# and Visual Basic). It has no effect on other methods. To set the apartment state of threads you start in your code, use the Thread.SetApartmentState method before starting the thread.

Похоже, что пытались синхронизировать доступ к этому методу, но не разобрались и сделали это неправильно. (Но возможно это я чего-то недопонимаю).
Re[2]: WebSite <STAThread()>
От: Monstrik  
Дата: 02.08.07 08:31
Оценка:
Здравствуйте, Овощ, Вы писали:

О>Здравствуйте, Monstrik, Вы писали:


О>В msdn про этот атрибут пишут следующее: Apply this attribute to the entry point method (the Main() method in C# and Visual Basic). It has no effect on other methods. To set the apartment state of threads you start in your code, use the Thread.SetApartmentState method before starting the thread.


О>Похоже, что пытались синхронизировать доступ к этому методу, но не разобрались и сделали это неправильно. (Но возможно это я чего-то недопонимаю).



синхронизировать кого с кем?
и по поведению похоже что работает как отдельныи поток?
как можно проверить точно???

msdn я видел краток он и про наш случаи даже в гугле ничо не нашел
Re[3]: WebSite <STAThread()>
От: Овощ http://www.google.com
Дата: 02.08.07 09:34
Оценка:
Здравствуйте, Monstrik:

К сожалению у меня нет глубоких знаний по Interopу с COM'ом, но по этому поводу у меня такие мысли: атрибут STAThread здесь применен ошибочно.
Во первых говорится что "COM threading models only pertain to applications that use COM interop. Using this attribute in an application that does not use COM interop has no effect.", а в данном коде используются только managed классы.
Во вторых — "Apply this attribute to the entry point method (the Main() method in C# and Visual Basic). It has no effect on other methods.", а в данном случае он применен к обычному методу, а не к entry point.
По исходному коду данный метод должен быть синхронизированным, т.е. в конкретный момент времени он должен выполняться только одним потоком, в противном случае при одновременном доступе из несколькоих потоков содержимое файла может быть повреждено. И авторы кода думали что использование атрибута STAThread приведет к такому поведению. Однако это не будет работать.
Если нужна синхронизировать данный метод малой кровью, то нужно применить к нему атрибут [MethodImpl(MethodImplOptions.Synchronized)]. (Тогда одновременно только один поток будет выполнять этот метод, а остальные потоки, тоже вызвавшие этот метод будут залочены пока первый не выйдет из него) Но лучше было бы сделать это вручную через оператор lock.
Если все же нужно применить атрибут STAThread, то в ASP.NET для этого используется директива @Page c атрибутом AspCompat.

Вот такая вот моя имха. Если ошибся — извините.
Re[4]: WebSite <STAThread()>
От: Monstrik  
Дата: 02.08.07 14:30
Оценка:
Спасибо вполне самодостаточно
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.