c#在不中断整个程序的情况下完成更大任务的最佳方式是什么
我的问题是我想执行一些操作,比如从某个URL获取数据(格式为字符串)。我想在后台运行这个过程。我必须在用户需要时调用此操作。就像用户单击为此操作指定的按钮一样,它应该执行函数并向该用户提供结果。问题是,当执行这个程序时,任何其他程序都不应该被中断。我想以这种异步方式运行。我想返回从URL下载的结果 这是我使用线程的解决方案c#在不中断整个程序的情况下完成更大任务的最佳方式是什么,c#,multithreading,background-task,background-thread,C#,Multithreading,Background Task,Background Thread,我的问题是我想执行一些操作,比如从某个URL获取数据(格式为字符串)。我想在后台运行这个过程。我必须在用户需要时调用此操作。就像用户单击为此操作指定的按钮一样,它应该执行函数并向该用户提供结果。问题是,当执行这个程序时,任何其他程序都不应该被中断。我想以这种异步方式运行。我想返回从URL下载的结果 这是我使用线程的解决方案 namespace xyz { public class newWinForm : Form { SomeClass someClass =
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()如果getResult包含返回字符串类型的代码,则我将在x内获得结果。在这个后台工作程序执行之后,我如何返回并为某些字符串赋值?比如string result=backgroundWorker?result()代码>在类中声明字符串(在方法之外),然后您可以通过BackgroundWorker中的函数操作该字符串。这里有一个RunWorkerCompleted事件:看起来像Thread.Isbackground=true代码>我想要的结果就像我调用字符串x=getStringResult()如果getResult包含返回字符串类型的代码,则我将在x内获得结果。在这个后台工作程序执行之后,我如何返回并为某些字符串赋值?比如string result=backgroundWorker?result()代码>在类中声明字符串(在方法之外),然后可以通过BackgroundWorker中的函数操作该字符串。这里有一个RunWorkerCompleted事件:正确,无需显式创建新线程。通过使用async/await
应用程序等待响应时,主线程将重新获得控制权。在场景后面,当数据准备就绪时,它将发送一个事件并继续运行您的方法。好的!但是异步方法总是无效的!是否可以返回字符串?您可以通过返回任务
从异步
方法返回数据。因此,如果您想要返回一个字符串,它将如下所示:private async Task
。但在本例中,我们对事件使用了async
,因此必须返回void
。因此,您需要执行@hustlecoder建议的操作,在类中使用成员变量。正确,无需显式创建新线程。通过使用async/await
应用程序等待响应时,主线程将重新获得控制权。在场景后面,当数据准备就绪时,它将发送一个事件并继续运行您的方法。好的!但是异步方法总是无效的!是否可以返回字符串?您可以通过返回任务
从异步
方法返回数据。因此,如果您想要返回一个字符串,它将如下所示:private async Task
。但在本例中,我们对事件使用了async
,因此必须返回void
。因此,您需要执行@hustlecoder建议的操作,在类中使用成员变量。