c#在不中断整个程序的情况下完成更大任务的最佳方式是什么

c#在不中断整个程序的情况下完成更大任务的最佳方式是什么,c#,multithreading,background-task,background-thread,C#,Multithreading,Background Task,Background Thread,我的问题是我想执行一些操作,比如从某个URL获取数据(格式为字符串)。我想在后台运行这个过程。我必须在用户需要时调用此操作。就像用户单击为此操作指定的按钮一样,它应该执行函数并向该用户提供结果。问题是,当执行这个程序时,任何其他程序都不应该被中断。我想以这种异步方式运行。我想返回从URL下载的结果 这是我使用线程的解决方案 namespace xyz { public class newWinForm : Form { SomeClass someClass =

我的问题是我想执行一些操作,比如从某个URL获取数据(格式为字符串)。我想在后台运行这个过程。我必须在用户需要时调用此操作。就像用户单击为此操作指定的按钮一样,它应该执行函数并向该用户提供结果。问题是,当执行这个程序时,任何其他程序都不应该被中断。我想以这种异步方式运行。我想返回从URL下载的结果 这是我使用线程的解决方案

namespace xyz
{

    public class newWinForm : Form
    {
        SomeClass someClass = new SomeClass();

        public newWinForm()
        {
          Thread backgroundThread = new Thread(DoWork);
          backgroundThread.IsBackground = true;
          backgroundThread.Start();

         }
         void DoWork()
         {
            try
            {
              Console.WriteLine("Doing some work...");
              using(WebClient cl = new WebClient())
              {
               string result = cl.DownloadString("http://www.......com");
              } 
              Thread.Sleep(1000);
             }
             finally
             {
               Console.WriteLine("This should be always executed");
             }
          }
         private void getDataFrmUrlButton_Click(object sender, EventArgs e)
         {
          Thread backgroundThread = new Thread(DoWork);
          backgroundThread.IsBackground = true;
          backgroundThread.Start();
         }
}

您可以使用backgroundworker类来完成任务

private BackgroundWorker bg1 = new BackgroundWorker();
 bg1.DoWork += bg1_DoWork;

 private void bg1_DoWork(object sender, DoWorkEventArgs e)
        {
           //the function you want to execute
        }

您可以使用backgroundworker类来完成任务

private BackgroundWorker bg1 = new BackgroundWorker();
 bg1.DoWork += bg1_DoWork;

 private void bg1_DoWork(object sender, DoWorkEventArgs e)
        {
           //the function you want to execute
        }

在这种情况下,您的操作是I/O绑定的,因此异步方法是最好的。为此,您可以在事件中使用
async
关键字

private async void getDataFrmUrlButton_Click(object sender, EventArgs args)
{
    using(var client = new WebClient())
    {
        string result = await client.DownloadStringTaskAsync(uri);

        // Do stuff with data
    }
}

提供了一些很好的资源,以获取有关
async/await

的详细信息。在这种情况下,您的操作是I/O绑定的,因此异步方法是最好的。为此,您可以在事件中使用
async
关键字

private async void getDataFrmUrlButton_Click(object sender, EventArgs args)
{
    using(var client = new WebClient())
    {
        string result = await client.DownloadStringTaskAsync(uri);

        // Do stuff with data
    }
}

提供了一些很好的资源,以获取有关
async/await

的详细信息如果您想要一个更基于企业的解决方案,可以查看Hangfire()


虽然通常针对ASP.NET解决方案,但您也可以将其作为应用程序的一部分运行,并将其与基于WinForm的应用程序结合使用。它将允许您轻松地移交长时间运行的任务并跟踪它们,即使您不想自己使用它。

如果您想要更基于企业的解决方案,您可以查看Hangfire()


虽然通常针对ASP.NET解决方案,但您也可以将其作为应用程序的一部分运行,并将其与基于WinForm的应用程序结合使用。它将允许您轻松地移交长时间运行的任务并跟踪它们,即使您不想自己使用它。

好吧,它看起来像
Thread.Isbackground=true我想要的结果就像我调用
字符串x=getStringResult()string result=backgroundWorker?result()在类中声明字符串(在方法之外),然后您可以通过BackgroundWorker中的函数操作该字符串。这里有一个RunWorkerCompleted事件:看起来像
Thread.Isbackground=true我想要的结果就像我调用
字符串x=getStringResult()string result=backgroundWorker?result()在类中声明字符串(在方法之外),然后可以通过BackgroundWorker中的函数操作该字符串。这里有一个RunWorkerCompleted事件:正确,无需显式创建新线程。通过使用
async/await
应用程序等待响应时,主线程将重新获得控制权。在场景后面,当数据准备就绪时,它将发送一个事件并继续运行您的方法。好的!但是异步方法总是无效的!是否可以返回字符串?您可以通过返回
任务
异步
方法返回数据。因此,如果您想要返回一个字符串,它将如下所示:
private async Task
。但在本例中,我们对事件使用了
async
,因此必须返回
void
。因此,您需要执行@hustlecoder建议的操作,在类中使用成员变量。正确,无需显式创建新线程。通过使用
async/await
应用程序等待响应时,主线程将重新获得控制权。在场景后面,当数据准备就绪时,它将发送一个事件并继续运行您的方法。好的!但是异步方法总是无效的!是否可以返回字符串?您可以通过返回
任务
异步
方法返回数据。因此,如果您想要返回一个字符串,它将如下所示:
private async Task
。但在本例中,我们对事件使用了
async
,因此必须返回
void
。因此,您需要执行@hustlecoder建议的操作,在类中使用成员变量。