แอปพลิเคชัน vb.net หยุดทำงานด้วย TeamViewer

ฉันทำงานกับแอปพลิเคชันและพบว่าเมื่อเชื่อมต่อระยะไกลผ่าน TeamViewer และ Radmin แอปพลิเคชันค้าง
เมื่อค้าง ไม่มีข้อยกเว้น UI จะไม่ตอบสนองและกระบวนการไม่ค้างในการตรวจสอบทรัพยากรหรือตัวสำรวจกระบวนการ .

ข้อมูลจำเพาะพื้นฐานบางประการสำหรับแอปพลิเคชัน: เชื่อมต่อกับพอร์ต COM 2 พอร์ต หนึ่งอันสำหรับอินพุต หนึ่งอันสำหรับเอาต์พุต เอาต์พุต COM ยังต้องการสัญญาณ Keep ALIVE ทุกๆ 5 วินาที มีเธรดผู้ปฏิบัติงานเบื้องหลัง 4 เธรดที่รันงานต่างๆ ตั้งแต่การอัปเดต UI ไปจนถึงเอาต์พุตเสียงพูด ตลอดจนการจัดการอินพุตข้อมูล UI แสดงข้อมูลแบบเรียลไทม์จากแหล่งข้อมูล 3 แห่งที่แยกจากกัน สองพอร์ตคือพอร์ต COM หนึ่งพอร์ตคือ MS SQL

RDP ไม่แฮงค์แอปพลิเคชันเลย

มีความคิดเห็นเกี่ยวกับสิ่งที่อาจทำให้เกิดสิ่งนี้หรือไม่?

มันทำงานบน .NET 4.5.1 ที่สร้างขึ้นใน VS Ultimate 2013 พร้อมแบ็กเอนด์ SQL 2012

ฉันได้ลองเปลี่ยนระหว่าง 64 บิตและ 32 บิตโดยไม่มีความคืบหน้าเช่นกัน

แก้ไข การตอบกลับ fsintegral

  1. ลูปทั้งหมดในแอปพลิเคชันสิ้นสุดแต่ถูกเรียกบ่อยมาก ตัวจับเวลาแต่ละตัวมีการทำซ้ำ 1.5 - 5 วินาที และมีบางครั้งที่กระบวนการภายในตัวจับเวลาใช้เวลานานกว่าเวลาขีด ตัวจับเวลาทั้งหมดจะโทรหาผู้ทำงานเบื้องหลังและตรวจสอบ .isBusy ก่อนเริ่มกระบวนการเพื่อหลีกเลี่ยงการทับซ้อนกัน

ตัวจับเวลามีจุดมุ่งหมายให้ทำงานอย่างไม่มีที่สิ้นสุด แต่สิ่งนี้แตกต่างจากการวนซ้ำแบบไม่มีที่สิ้นสุด

  1. มีวิธีตรวจสอบกล่องโต้ตอบที่มองไม่เห็นหรือไม่? ฉันไม่เชื่อว่ามีอยู่จริง แต่ฉันอยากรู้ว่าจะแน่ใจได้อย่างไร

  2. ฉันใช้เวลาส่วนใหญ่ในการเพิ่มประสิทธิภาพเวลาในการโหลดข้อมูลต่อผู้ปฏิบัติงานเบื้องหลัง และลดแต่ละกระบวนการลงเหลือน้อยกว่าหนึ่งวินาทีสำหรับการโหลดข้อมูล มีสองสิ่งที่ทำให้กระบวนการใดกระบวนการหนึ่งทำงานนานขึ้น หนึ่งในนั้นกำลังพูดการแจ้งเตือนโดยใช้ SpeachSynth และอาจใช้เวลานานถึง 60 วินาทีต่อบล็อกโค้ด อีกอันคืออีเมล ซึ่งฉันได้ใส่เข้าไปในกระบวนการอะซิงก์เพื่อป้องกันไม่ให้แอปพลิเคชันหยุดทำงานหากมีการหมดเวลา แต่แอปพลิเคชันค้างแม้ว่าจะไม่ได้ประมวลผลทั้งสองรายการนี้ก็ตาม

  3. เหตุการณ์เรียงซ้อน นี่จะเป็นเหตุการณ์ที่เกิดจากเหตุการณ์อื่นหรือไม่? หากเป็นเช่นนั้น แอปพลิเคชันจะไม่ใช้การดำเนินการประเภทนี้ อย่างไรก็ตาม แอปพลิเคชันจะเรียกใช้โมดูลแยกกันประมาณ 15 โมดูลจากคนงานเบื้องหลังอย่างน้อยหนึ่งคน ฉันไม่เชื่อว่านี่เป็นตัวเลขที่สูงเกินไป แต่แจ้งให้เราทราบหากเป็นเช่นนั้น ฉันสามารถโพสต์โค้ดเทียมได้หากเป็นปัญหา

  4. Application.Sleep() จะไม่ถูกใช้ แต่ Application.DoEvents() จะเกิดขึ้นเมื่อรอเป็นระยะเวลาหนึ่ง
    IE

    Dim startTime As Date = Now
    Dim timePassed As TimeSpan = Now - startTime
    Do Until timePassed.TotalSeconds > 5
       timePassed = Now - startTime
       Application.DoEvents()
    Loop
    

สาเหตุหลักของความคลุมเครือคือฉันหวังว่าปัญหานี้จะทราบกับ TeamViewer หรือ Radmin ตามประเภทของรายการในแอปพลิเคชัน เวอร์ชัน IE SQL, พอร์ต COM และ BW

ขอขอบคุณล่วงหน้า


person Branden DiLorenzo    schedule 25.10.2014    source แหล่งที่มา
comment
คำแนะนำบางประการเมื่อแอปพลิเคชันค้าง: 1) วนซ้ำไม่มีที่สิ้นสุด 2) กล่องโต้ตอบที่มองไม่เห็น 3) การโหลดข้อมูลที่ยาวมาก 4) เหตุการณ์ต่อเนื่องกันที่เกิดขึ้นต่อเนื่องกันเป็นวงจร 5) Application.Sleep() - ดังนั้น ให้หยุดดีบักเกอร์ชั่วคราว และใช้โหมดทีละบรรทัดเพื่อค้นหาปัญหา อาจอยู่ที่ไหนก็ได้ หากไม่มีโค้ดที่น่าสงสัยให้เริ่มต้น แต่เป็นเพียงคำอธิบายที่คลุมเครือมากของคุณ ก็ทำอะไรไม่ได้มากนัก   -  person Karl Stephen    schedule 25.10.2014
comment
ฉันจะไม่ตอบคำถามนี้อีกต่อไป ไม่มีใครเคยกล่าวขอบคุณเมื่อฉันอธิบายสิ่งที่พวกเขาจำเป็นต้องทำ เพียงอ่าน blogs.msdn.com/b/dsui_team/archive/2012/10/31/   -  person Hans Passant    schedule 25.10.2014
comment
ฉันจะเรียกใช้ windbg คืนนี้เพื่อดูว่าเกิดอะไรขึ้น ขอบคุณฮันส์!   -  person Branden DiLorenzo    schedule 26.10.2014


คำตอบ (2)


Hans Passant - ดังที่บางครั้งเราพูดในอเมริกาว่า "เพื่อน คุณเจ๋งมาก!" น่าเสียดายที่ผู้คนไม่ได้ชื่นชมสิ่งที่คุณให้มา แต่ลิงก์นั้น แม้จะซับซ้อนสำหรับโปรแกรมเมอร์ VB.NET ทั่วๆ ไป (ฉันอยู่ในประเภทนั้น) ก็เป็น เครื่องช่วยชีวิต
โซลูชันของฉันแตกต่างไปเล็กน้อยจากสิ่งที่แก้ไขปัญหาของ OP ฉันประสบปัญหาเดียวกันทุกประการที่ OP อธิบายไว้ อย่างไรก็ตาม การเปลี่ยนการวิงวอนของฉันเป็น เริ่มต้น ไม่ใช่ทั้งหมดที่ฉันต้องทำ จากลิงก์ของคุณ เห็นได้ชัดว่าฉันต้องแน่ใจว่าได้เริ่มแบบฟอร์มที่ฉันได้ใส่ไว้ในเธรดอื่นโดยใช้ ApartmentSateSTA ฉันไม่ได้ตั้งค่าอย่างชัดเจนและกำลังวางแบบฟอร์มบนเธรดพูลโดยตรงโดยใช้

System.Threading.ThreadPool.QueueUserWorkItem(AddressOf RunProgressForm)

ดูเหมือนว่าจะใช้เธรด MTA จากเธรดพูลเท่านั้น เปลี่ยนไปสร้าง threading.thread ที่ชัดเจนแล้วใช้

ProgBoxTHD = New Threading.Thread(AddressOf RunForm)
ProgBoxTHD.IsBackground = True
ProgBoxTHD.SetApartmentState(Threading.ApartmentState.STA)
ProgBoxTHD.Priority = Threading.ThreadPriority.Normal
ProgBoxTHD.Start()

ซึ่งช่วยให้สามารถส่งข้อความ Windows ได้อย่างต่อเนื่องหลังจากที่ TeamViewer เปลี่ยนการตั้งค่าเดสก์ท็อป (ซึ่งเป็นเวลาที่แอปพลิเคชันของฉันจะล็อก) นอกจากนี้ยังจำเป็นต้องตั้งค่า .IsBackground เป็น True มิฉะนั้นแบบฟอร์มจะหยุดค้างที่ทางออกเพื่อรอบางสิ่งบางอย่าง ฉันรู้ว่าฉันควรตรวจสอบสิ่งนั้น แต่การตั้งค่า IsBackgrounds ทำให้เธรดออกได้โดยไม่ต้องรอให้สิ่งอื่นหยุด และเมื่อถึงจุดที่ฉันกำลังออก ฉันก็ไม่สนใจจริงๆ

โปรดทราบ - เจ้าหน้าที่ของ TeamViewer ไม่ช่วยอะไรเลย อย่างแน่นอน หลังจากที่ให้ฉันถอนการติดตั้ง/ติดตั้งใหม่ และปิด DirectX - พวกเขาไม่สามารถให้ความช่วยเหลือเพิ่มเติมได้ น่าเศร้าที่ฉันใช้โซลูชันการแชร์หน้าจอหลายแบบและมีเพียง TeamViewer เท่านั้นที่ล็อกโปรแกรมของฉัน แม้ว่าวิธีแก้ปัญหาคือแก้ไขโปรแกรม ของฉัน จริงๆ ฉันคิดว่า TeamViewer ควรดูว่าพวกเขาเปลี่ยนการตั้งค่าเดสก์ท็อปอย่างไรเมื่อเชื่อมต่อ ฉันใช้เวลาเกือบสองสัปดาห์กับข้อผิดพลาดนี้เพียงอย่างเดียว! ฉันใช้ TeamViewer เพื่อให้การสนับสนุนแก่ลูกค้าของฉัน และปัญหาเกิดขึ้นเมื่อ TeamViewer เชื่อมต่อ หรือ ยกเลิกการเชื่อมต่อ เมื่อใดก็ตามที่ฉันให้การสนับสนุน ฉันจะทิ้งลูกค้าไว้กับโปรแกรมที่ถูกล็อค! นั่นทำให้ฉันดูแย่!

person Destek    schedule 20.08.2017

ตกลง. ฉันคิดออกแล้ว

โดยพื้นฐานแล้ว สาเหตุของปัญหาคือแอปพลิเคชันการดูระยะไกลเหล่านี้ส่งผลต่อ UI ของแอปพลิเคชัน .NET อย่างไร

ภายในแอปพลิเคชันของฉันมีกล่องข้อความสองกล่องที่อัปเดตจากเธรดต่างๆ ภายในแอป ฉันใช้รหัสต่อไปนี้เพื่ออัปเดตข้อความ วิธีการ .Inrigg เป็นปัญหา

    Delegate Sub SetTextCallback(ByVal [text] As String, ByRef txtHomeActiveDataStream As TextBox, ByVal type As String)
    Public Sub ReceivedText(ByVal [text] As String, ByRef txtHomeActiveDataStream As TextBox, ByVal type As String) 'input from ReadExisting
      Dim receivedString As String = text
      Dim currentText As String

      If txtHomeActiveDataStream.InvokeRequired Then
          Dim x As New SetTextCallback(AddressOf ReceivedText)
          txtHomeActiveDataStream.Invoke(x, New Object() {(text), txtHomeActiveDataStream, type})

      Else
           txtHomeActiveDataStream.Text &= receivedString 
      End If


    End Sub

ด้วยการเปลี่ยนวิธีการจาก .Invoke เป็น .BeginInrigg ฉันสามารถป้องกันไม่ให้แอปพลิเคชันหยุดทำงาน เห็นได้ชัดว่าเป็นเพราะข้อเท็จจริงที่ว่า .Involve ต้องการ postback ไปยัง UI ก่อนที่จะเผยแพร่ และ TeamViewer กำลังคว้า UI ในลักษณะที่ไม่เคยส่ง postback กลับไปยัง UI ด้วย BeginInrigg ระบบจะเพิกเฉยต่อ postback ดังนั้นจึงไม่ติดค้างกับ TeamViewer อย่างไม่มีกำหนดอีกต่อไป

ขอขอบคุณข้อมูลจาก windbg แต่ฉันไม่สามารถเรียกใช้งานตามบทความที่คุณส่งมาได้ ฉันลงเอยด้วยการใช้ ProcessExplorer และสร้างไฟล์ดัมพ์เพื่อดูว่าโค้ดค้างอยู่ที่บรรทัดใด ฉันลองใช้ VS 2013 ในโหมดดีบัก แต่แอปพลิเคชันจะไม่หยุดทำงานขณะทำงานในการดีบัก ไปคิดดู.

ขอบคุณสำหรับข้อมูลของคุณ ฉันหวังว่านี่จะช่วยคนอื่นได้ในอนาคต ฉันใช้เวลาเกินกว่าที่จะยอมรับกับปัญหานี้ และยินดีที่จะแก้ไขปัญหานี้

หากคุณมีความคิดเห็นเพิ่มเติมโปรดแจ้งให้เราทราบ

ฉันพบโพสต์นี้เพื่อช่วยแก้ไขปัญหา

person Branden DiLorenzo    schedule 26.10.2014