我正在编写一个从网页上抓取数据的C#控制台应用程序.
此应用程序将访问大约8000个网页并刮取数据(每页上的数据格式相同).
我现在正在使用它,没有异步方法,也没有多线程.
但是,我需要它更快.它只使用了大约3%-6%的CPU,我想是因为它花时间等待下载html.(WebClient.DownloadString(url))
这是我的程序的基本流程
DataSet alldata;
foreach(var url in the8000urls)
{
// ScrapeData downloads the html from the url with WebClient.DownloadString
// and scrapes the data into several datatables which it returns as a dataset.
DataSet dataForOnePage = ScrapeData(url);
//merge each table in dataForOnePage into allData
}
// PushAllDataToSql(alldata);
Run Code Online (Sandbox Code Playgroud)
我一直试图多线程,但不知道如何正确开始.我正在使用.net 4.5并且我的理解是异步并且等待4.5以使这更容易编程但我仍然有点迷失.
我的想法是继续制作这条线异步的新线程
DataSet dataForOnePage = ScrapeData(url);
Run Code Online (Sandbox Code Playgroud)
然后当每个人完成时,跑
//merge each table in dataForOnePage into allData
Run Code Online (Sandbox Code Playgroud)
任何人都可以指出我正确的方向如何在.net 4.5 c#中使该行异步,然后让我的合并方法运行完成?
谢谢.
编辑:这是我的ScrapeData方法:
public static DataSet GetProperyData(CookieAwareWebClient webClient, string pageid)
{
var dsPageData …
Run Code Online (Sandbox Code Playgroud) 据我所知,在XAML中完成的所有事情都可以在C#中完成.
为什么XAML是用BAML而不是C#编译的?在编译时解析XAML并创建相应的C#代码会不会更有效率?
我有一个文本框绑定到我的ViewModel上名为DatabaseFilter的属性
这是属性的实现
public string DatabaseFilter {
get { return _databaseFilter; }
set {
_databaseFilter = value;
FilterDatabases();
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我正在尝试根据文本框中键入的内容触发过滤.
问题是,当文本框失去焦点时会触发setter.因此,在用户按下TAB之前,键入文本框不会执行任何操作.
是否可以通过绑定每次按键进行视图模型下的绑定更新?我想避免添加键向下/向上事件,以保持UI /代码尽可能干净.
我正在学习如何使用WCF,我正在尝试从头开始编写一个小的HelloWorld程序(主机和客户端).ProtocolException Unhandled
每当我的客户尝试使用该服务时,我都会得到一个,我无法弄明白为什么.我正在使用IIS托管服务.
关于我设置的方式:我正在尽力分离客户端,代理,主机,服务和合同,详见本视频和本文所述.基本上我在解决方案中为每个项目提供了不同的项目.
这里有一些不同的文件显示我在说什么:
namespace HelloWorld
{
public class HelloWorldService : IHelloWorldService
{
public String GetMessage(String name)
{
return "Hello World from " + name + "!";
}
}
}
Run Code Online (Sandbox Code Playgroud)
namespace HelloWorld
{
[ServiceContract]
public interface IHelloWorldService
{
[OperationContract]
String GetMessage(String name);
}
}
Run Code Online (Sandbox Code Playgroud)
namespace HelloWorld
{
public class Proxy : ClientBase<IHelloWorldService>, IHelloWorldService
{
#region IHelloWorldService Members
public String GetMessage(String name)
{
return Channel.GetMessage(name);
}
#endregion
}
Run Code Online (Sandbox Code Playgroud)
}
namespace Client …
Run Code Online (Sandbox Code Playgroud) 我开发这个应用程序VB.net 2010
和SQL 2008
.
我希望通知客户端有关db的更新,以及用于使用计时器检查db在指定分钟内的更改的应用程序,这实际上效率不高.我读到query notification
,sqldependency
,service broker
,但后来我读到的东西,说他们可能不是有效的,如果我有100个客户,我使用查询通知推送通知我的申请.
有人会帮我解决我应该做的事情,以及如何做到这一点(如果可以提供示例,将会非常有用).提前致谢!
sql-server service-broker push-notification sqldependency query-notifications
所以基本上用户从扫描仪输入中输入一个序列.
12, 3, 4
等
它可以是任何长的长度并且它必须是整数.
我想将字符串输入转换为整数数组.
所以int[0]
会12
,int[1]
也会3
,等等
任何提示和想法?我正在考虑实现if charat(i) == ','
获取前一个数字并将它们解析在一起并将其应用于数组中当前可用的插槽.但我不太确定如何编码.
我在C#中的代码(asp.net MVC)
StreamWriter tw = new StreamWriter("C:\\mycode\\myapp\\logs\\log.txt");
// write a line of text to the file
tw.Write("test");
Run Code Online (Sandbox Code Playgroud)
文件已创建但为空.没有异常被抛出.我以前从未见过这个,我被困在这里; 我只需要编写一些调试输出.
请指教.
什么是设计气味,递归的不良做法?一旦我看到resharper暗示改进,我就快速浏览了谷歌.看到关于将尾部递归重新分解为迭代并将其称为设计气味的众多评论.
public static void DebugOutput2(Exception ex) {
if (ex == null) {
return;
}
Debug.WriteLine(ex.Message);
if (ex.InnerException != null) {
DebugOutput2(ex.InnerException);
}
}
// WAS REFACTORED TO
public static void DebugOutput(Exception ex) {
if (ex == null) {
return;
}
while (true) {
Debug.WriteLine(ex.Message);
if (ex.InnerException != null) {
ex = ex.InnerException;
continue;
}
break;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:获得C#编译器处理评论.看起来它现在是递归的
Target .net 4.5.C#5.0
用于尾递归版本的ILDASM输出:显示递归调用而不是迭代
.method public hidebysig static void DebugOutput(class [mscorlib]System.Exception ex) cil managed
{
// Code size 54 (0x36)
.maxstack 2 …
Run Code Online (Sandbox Code Playgroud) 我Unable to Start Debugging
在visual studio 2012中收到此错误.
我还更新了远程调试sp2.
也卸载并重新安装vs2012并添加了sp.仍面临同样的问题.
我的操作系统是windows-8 64位.
还尝试在Administrator用户中运行仍然相同.
无法启动调试.视觉工作室2012
从数据库获取提供程序信息时发生错误.这可能是由实体框架使用不正确的连接字符串引起的.检查内部异常以获取详细信息,并确保连接字符串正确.
内在例外: {"The provider did not return a ProviderManifestToken string."}
我搜索过其他线程,因为有很多类似的错误,但我似乎无法找到解决方案.
我正在使用VS2012 Professional和SQL Server 2012.我可以使用Windows身份验证使用Server explorer连接到服务器.我正在构建一个具有多层的webforms应用程序.其中一个包含我的Entity框架层,其中包含我的Context类.
<?xml version="1.0"?>
<!--
For more information on how to configure your ASP.NET application, please visit
http://go.microsoft.com/fwlink/?LinkId=169433
-->
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" />
</system.web>
<connectionStrings>
<add name="MYSQLSERVER"
providerName="System.Data.SqlClient"
connectionString="Data Source=myComputer\MYSQLSERVER;Trusted_Connection=true"></add>
</connectionStrings>
</configuration>
Run Code Online (Sandbox Code Playgroud)
这就是我的Entity Framework类库层中的app.config.
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="v11.0" />
</parameters>
</defaultConnectionFactory>
</entityFramework>
</configuration>
Run Code Online (Sandbox Code Playgroud)
此外,我已尝试将app.config defaultConnectionFactory类型更改为
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
Run Code Online (Sandbox Code Playgroud)
但它没有改变任何东西.
我不确定我所做的任何改变甚至意味着让我担心.当然,我可以在线找到解决方案并修复我的问题,但我真的很想了解web.config以及这一切意味着什么.除了找到解决这个问题的方法之外,还有人能指出我正确的方向来学习web.configs吗?
谢谢你的帮助.
c# ×6
.net ×2
wpf ×2
.net-4.5 ×1
64-bit ×1
asp.net-mvc ×1
baml ×1
data-binding ×1
debugging ×1
file-io ×1
iis ×1
iis-express ×1
integer ×1
java ×1
mvvm ×1
sql ×1
sql-server ×1
string ×1
user-input ×1
wcf ×1
windows-8 ×1
xaml ×1