ไม่สามารถที่จะปรับปรุงส่วนติดต่อผู้ใช้หลังจากเบื้องหลังงานเสร็จสมบูรณ์ในของฉัน ASP.NET โปรแกรม

0

คำถาม

ฉันกำลังมานานกำลังฟังก์ชันเป็นภาพพื้นหลังงานอยู่ของฉัน asp.net โปรแกรม ก่อนที่งาน completes หลักของเธรดออกจาก(ฉันอยากให้มันเป็นอย่างนั้นเท่านั้นตั้งแต่ถ้าผมจะขอใช้ห้องรอคำสั่งคำค้นและทำให้หลักเธรดรอจนกว่าเบื้องหลังงาน completes ฉันเข้าใจของพร็อกซีเกิดข้อผิดพลาดกับข้อความ

เกิดข้อผิดพลาดของพร็อกซี
พร็อกซีเซิร์ฟเวอร์ได้รับการไม่ถูกต้องการตอบสนองจาก upstream เซิร์ฟเวอร์ตั้งแต่เบื้องหลังงานนานเกินไป

แต่ครั้งหนึ่งหลังจากที่งานเสร็จสมบูรณ์ก็เหมือนกัฉันสามารถที่จะปรับปรุงหน้าเว็บโดย redirecting เดียวกันกับที่หน้าหรือไม่ฉันสามารถใช้แทนที่ส่วนติดต่อผู้ใช้ขอ. มันมีทางที่จะปรับปรุงส่วนติดต่อผู้ใช้หลังจากเธรดหลัก completes กประหารชีวิต

ของรหัสผ่านแบบนี้:

protected void btnImport_Click(object sender, EventArgs e)
{
        var task = ImportThread();

        if (task.IsCompleted)
        {
            DisplaySuccess("Import success");
        }
        else
            DisplayError("Import failed");
}

private async Task<bool> ImportThread()
{
        try
        {
            var success = await Task<bool>.Run(() => new Manager().Import().ConfigureAwait(false);

            if (task.IsCompleted)
            {
                DisplaySuccess("Import success");
            }
            else 
            {
                DisplayError("Import failed");
            }
    
            return true;
}

ที่อยู่เหนือ async งานอยู่ที่วิธีการด้านล่างซึ่งเป็นของขวัญอยู่ในอีกห้องเรียน

public bool Import()
{
    // some operations here
    return true;
}

หลังจากเรื่องนี้วิธีการ completes ที่ควบคุมกลับมาทางกลับทางเดียวคือทาง ImportThread() แต่กฎเขียนอยู่ที่นั่นเพื่อยกเลิกส่วนติดต่อผู้ใช้ไม่ได้กำลังปรับปรุงส่วนติดต่อผู้ใช้ขอ. ฉันต้องการจะปรับปรุงส่วนติดต่อผู้ใช้กับสถานะของการนำเข้า แล้วก็จาก ImportThread ควบคุมไม่ได้ต้องกลับไปคลิกที่ปุ่มเหตุการณ์วิธีการเหมือนกัน

ได้โปรดช่วยฉันกับมีทางที่จะปรับปรุงส่วนติดต่อผู้ใช้ของสถานะของการนำเข้า

ข้อควรจำ:ฉันพยายามใช้ Redirect.Response ใน ImportThread() ต้องการเรียกปรับปรุงหน้าแต่นั่นไม่ได้ทำงาน

asp.net async-await background-task c#
2021-11-23 19:55:22
2

คำตอบที่ดีที่สุด

1

ปัญหาของคุณคือคุณต้องและอยู่ภายใต้เงื้อมมือไปยืนที่หน้าเว็บ lifecycle อยู่ที่นี่

คุณมีคดีนี้อยู่ในที่หน้าเว็บก็คือนั่งอยู่บผู้ใช้งานพื้นที่ทำงาน:

enter image description here

ตอนนี้บอกผู้ใช้ลิกปุ่ม.

ตอนนี้คุณเรื่องนี้:

 var task = ImportThread();

    if (task.IsCompleted)

โอเคดังนั้นที่หน้าเว็บขึ้นบนเครื่องเซิร์ฟเวอร์ คุณสามารถเข้าถึงแม้ async รอพบท่านอยู่ยังไงก็ได้นานแค่ไหนก็ตามแต่คุณยังต้อนี้:

enter image description here

ดังนั้นตราบใดที่รหัสของคุณวิ่งหนีหรือรองหน้าเว็บเป็นยังติดอยู่บนเซิร์ฟเวอร์ด้านหนึ่ง แค่จนกว่ารหัส completes และออกจากทำหน้าที่เดินทางลงไปที่ลูกค้าด้านหนึ่ง

อีกครั้ง: รหัสของคุณข้างหลังไม่สามารถหยุดและไม่สามารถเดี๋ยวสำหรับบางอย่างให้เสร็จตั้งแต่ถ้าเป็นแบบนั้นต่อหน้าเหลือขึ้นมาบนเซิร์ฟเวอร์จนกว่าการประมวลผลเสร็จสิ้นแล้ว

งั้นแล้วหลังจากนั้นขึ้นอยู่กับที่หน้าเว็บจะทำให้คนเดินทางกลับลงไปที่ลูกค้าด้านหนึ่ง นี่ก็เกิดขึ้น;

enter image description here

และจากนั้นเซิร์ฟเวอร์ด้านข้างหน้าก็คือถูกโยนออกจากความทรงจำและทั้งหมดที่ชั้นเรียนตัวแปรเป็นทำลาย!!! เว็บเซิร์ฟเวอร์ตอนนี้รอให้มีผู้ใช้ที่โพสกลับมาเป็นหน้าสำหรับการประมวลผล!!

ดังนั้นถ้าคุณต้องวิ่งหนีบางอย่างขนานหรดำเินินการทีนี้รู้รึยัง

คุณมีไม่กี่ทางเลือก:

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

และคุณไม่จำเป็นต้องใช้อาแจ็กซ์โทรมา คุณอาจจะใช้จาวาสคริปต์แบบง่ายๆลูกค้าของด้านแบบนั้นกับตัวตั้งเวลานั้นบอกลินปุ่มทุก 1 หรือ 2 วินาทีที่หัสหลังวิ่งหนีและมันก็ต้องเอาสถานะของนานขนาดนั้นกำลังโพรเซส(อีกครั้งอาจจะมาจากกลุ่มงาน)และจากนั้นก็ปรับปรุงส่วนแสดงผล และจากนั้นคุณอาจรวมถึงรหัสที่จะหยุดจับเวลาตอนที่สถานะเปลี่ยนแปลงไปว่า"ทำ"หรืออะไรก็ตาม

แล้วรหัสอยู่หลังไม่ได้และจะไม่ยอม"ปรับปรุง"ในหน้าเว็บหลายครั้งแล้ว คุณมีครเดินทางแล้วรหัสอยู่หลังต้องวิ่งรวดเร็วจะต้องจบวิ่งอยู่และไม่สามารถใช้คำสั่งรอคำสั่ง,ตั้งแต่นั้นมาที่หน้าจะ STLL เดี๋ยวก่อนและยังคงติดอยู่บนเครื่องเซิร์ฟเวอร์

ถ้าเธออยากออกไปนอกเหนือที่เรียบง่ายจับเวลาหลอกวิธี-ซึ่งผมใช้บ่อยนัก?

งั้นคุณต้องการที่จะรับเลี้ยงดูและขอแนะนำเข้าของคุณบนเว็บไซต์บางอย่างออกแบบสำหรับนี่ประเภทของคดี-

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

SignalR

https://docs.microsoft.com/en-us/aspnet/signalr/overview/getting-started/introduction-to-signalr#:~:text=What%20is%20SignalR%3F%20ASP.NET%20SignalR%20is%20a%20library,process%20of%20adding%20real-time%20web%20functionality%20to%20applications.

2021-11-23 21:28:35
0

ถ้าคุณต้องการ asynchronously แจ้งให้ทราบเป็นของผู้ใช้(ขอให้สมบูรณ์หรือความล้มเหลวของอะไรอย่างเช่นงานออก)คุณสามารถใช้บนเว็บผลักการแจ้งให้ทราบ(ใช้ firebase ส่งข้อความคลาวด์)หรือ SignalR ซ็อกเกต. ตอนที่คุณใช้พื้นหลังของงานคุณจะสูญเสียหลักของเธรดและโชคร้ายที่มันไม่มีทางที่จะตอบสนองต่อการรักษาที่เกี่ยวข้องกันของผู้ใช้.

2021-11-23 20:31:11

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่