2012-09-03 51 views
10

VB6 có phương thức DoEvents() mà bạn gọi để trả về điều khiển cho hệ điều hành và bắt chước hành vi đa luồng trong môi trường luồng đơn đó.C# Tương đương VB 6 DoEvents

Tương đương với .NET Framework của VB 6 DoEvents() là gì?

+1

Tôi nghĩ bạn đang nghĩ đến Doevents. Năng suất là phương pháp .NET được sử dụng trong xử lý điều tra. Và tương đương trong .NET là Application.DoEvents() (bất kể ngôn ngữ được sử dụng) – Zippit

+2

'Application.DoEvents() == DoEvents'? – Marlon

+0

@Marlon: Tôi hiểu rồi. Thực ra tôi nhớ lại việc hỏi câu này vài năm một lần. Tôi không thể nhớ khi tôi hỏi nó lần cuối. Bạn có thể đúng và đó có thể là câu trả lời nhưng trí nhớ của tôi không thành công. Tôi cũng nghĩ rằng tôi tìm thấy một thay thế trong một trong những phương pháp của lớp System.Diagnostics.Process nhưng tôi không thể nhớ chắc chắn. –

Trả lời

8

Application.DoEvents() (một phần của WinForms)

+0

Còn WPF thì sao? Tôi ghét WinForms –

+3

@ColeJohnson Phương thức Application.DoEvents() cũ đã được depricated trong WPF có lợi cho việc sử dụng [* Dispatcher *] (http://msdn.microsoft.com/en-us/magazine/cc163328.aspx) hoặc [* Chủ đề công nhân nền *] (http://elegantcode.com/2009/07/03/wpf-multithreading-using-the-backgroundworker-and-reporting-the-progress-to-the-ui/) làm việc xử lý như bạn đã mô tả. Xem các liên kết cho một vài bài viết về cách sử dụng cả hai đối tượng. –

+0

Nói chung, tôi không khuyên bạn nên sử dụng DoEvents anyways. Nó có thể ngăn chặn một GUI. Các vấn đề của Google về Application.DoEvents –

23

bạn có thể sử dụng Application.DoEvents(). Tại sao không sử dụng Threading lớp học hoặc chỉ đơn giản là Background Workers? Nếu bạn đang làm trong môi trường .net, không sử dụng DoEvents. Để nó trên VB6.

1

Nếu bạn gọi Application.DoEvents() trong mã của bạn, ứng dụng của bạn có thể xử lý các sự kiện khác. Ví dụ: nếu bạn có biểu mẫu thêm dữ liệu vào ListBox và thêm DoEvents vào mã của bạn, biểu mẫu của bạn sẽ sơn lại khi một cửa sổ khác được kéo qua nó. Nếu bạn loại bỏ DoEvents khỏi mã của bạn, biểu mẫu của bạn sẽ không được gửi lại cho đến khi trình xử lý sự kiện nhấp chuột của nút được thực thi xong. Để biết thêm thông tin về nhắn tin, hãy xem Nhập người dùng trong Windows Forms.

Không giống như Visual Basic 6.0, phương pháp DoEvents không gọi phương thức Thread.Sleep.

5

Sau đây là một phương pháp DoEvents loại chung

using System; 
using System.Windows.Threading; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Security.Permissions; 

namespace Utilites 
{ 
/// <summary> 
/// Emulates the VB6 DoEvents to refresh a window during long running events 
/// </summary> 
public class ScreenEvents 
{ 
    [SecurityPermissionAttribute(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)] 
    public static void DoEvents() 
    { 
     DispatcherFrame frame = new DispatcherFrame(); 
     Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, 
      new DispatcherOperationCallback(ExitFrame), frame); 
     Dispatcher.PushFrame(frame); 
    } 

    public static object ExitFrame(object f) 
    { 
     ((DispatcherFrame)f).Continue = false; 

     return null; 
    } 
} 
} 

Nó không cần phải biết về các ứng dụng.